Query:
update cities c
inner join regions r on (c.region = r.region_id and c.code = r.country_code)
set c.region_id = r.id;
Ci sono 3 milioni di record in città, quindi il server MySQL fallisce durante l'esecuzione.
C'è un modo per usarlo con limite? Per ogni 100 mila record?
O qualsiasi altro modo per eseguire quella query?
Schema della tabella delle città
CREATE TABLE `cities` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`code` varchar(3) NOT NULL,
`city` varchar(30) NOT NULL,
`native_city` varchar(30) DEFAULT NULL,
`region` int(11) DEFAULT NULL,
`population` int(11) DEFAULT NULL,
`lat` decimal(9,7) DEFAULT NULL,
`lon` decimal(9,7) DEFAULT NULL,
`country_id` int(11) NOT NULL,
`region_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3173959 DEFAULT CHARSET=utf8
country_id
, region_id
non chiavi estranee. solo campi vuoti, che voglio riempire con valori di altri tavoli e poi aggiungerò fk
.
risposte:
1 per risposta № 1Come menzionato in MySQL UPDATE Sintassi
Per la sintassi di più tabelle, gli aggiornamenti di UPDATErighe in ogni tabella nominata in table_references che soddisfano le condizioni. Ogni riga corrispondente è aggiornato una volta, anche se corrisponde alle condizioni più volte. Per la sintassi di più tabelle, ORDER BY e LIMIT non possono essere utilizzate.
Ma puoi nascondere ORDER BY e LIMIT in una sottoquery e poi UNISCI con la tabella originale per aggiornare. Ecco un esempio:
update cities c
inner join
(select c1.id,r.id as r_id from cities c1
inner join regions r on (c1.region = r.region_id
and c1.code = r.country_code)
order by c1.id
LIMIT 1000
) c2 on c.id=c2.id
set c.region_id = c2.r_id