/ / Aggiornamento con limite o qualcosa del genere - mysql, sql

Aggiornamento con limite o qualcosa del genere - mysql, sql

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 № 1

Come 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