Consiglierei di usare INSERT...ON DUPLICATE KEY UPDATE
.
Se si utilizza INSERT IGNORE
, quindi la riga non verrà inserita se si traduce in una chiave duplicata. Ma la dichiarazione non generare un errore. Invece, genera un avvertimento. Questi casi includono:
- inserisci un tasto duplicato nelle colonne con
PRIMARY KEY
oUNIQUE
Restrizioni. - Inserire un null in una colonna con un
NOT NULL
restrizione “>
.
Se si utilizza MySQL effettivamente rende DELETE
seguito da un internamente, che ha alcuni effetti collaterali imprevisti:
- è assegnata una nuova identificazione auto-inclemente.
- il Le file dipendenti con tasti esterne possono essere rimosse (se vengono utilizzati tasti esterni a cascata) o evitare .
- Trigger che scattano il fuoco su
DELETE
sono eseguiti inutilmente. - Gli effetti collaterali sono anche diffusi negli schiavi della replica ION.
Correzione: entrambi e INSERT...ON DUPLICATE KEY UPDATE
sono invenzioni non standard, proprietari, specifici Mysql. ANSI SQL 2003 definisce un MERGE
che può risolvere la stessa necessità (e altro), ma MySQL non supporta il MERGE
Dichiarazione.
Un utente ha provato a modificare questo post (l’edizione è stata respinta dai moderatori). L’edizione ha cercato di aggiungere un’affermazione che INSERT...ON DUPLICATE KEY UPDATE
crea una nuova identificazione auto-inclemente assegnata. È vero che il nuovo ID è generato ma non viene utilizzato nella riga modificata.
Vedi la dimostrazione di seguito, testata con il server permanentemente 5.5.28. La variabile di configurazione innodb_autoinc_lock_mode=1
(il valore predefinito):
mysql> create table foo (id serial primary key, u int, unique key (u));mysql> insert into foo (u) values (10);mysql> select * from foo;+----+------+| id | u |+----+------+| 1 | 10 |+----+------+mysql> show create table foo\GCREATE TABLE `foo` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `u` int(11) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `u` (`u`)) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1mysql> insert into foo (u) values (10) on duplicate key update u = 20;mysql> select * from foo;+----+------+| id | u |+----+------+| 1 | 20 |+----+------+mysql> show create table foo\GCREATE TABLE `foo` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `u` int(11) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `u` (`u`)) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
Quanto sopra mostra che la dichiarazione di IODKU rileva il duplicato e richiama l’aggiornamento per modificare il valore di u
. Nota il AUTO_INCREMENT=3
indica che è stata generata un’identificazione, ma non è stata utilizzata nella riga.
mentre Elimina la riga originale e inserire una nuova riga, generando e archiviando una nuova identificazione auto-inclemente:
mysql> select * from foo;+----+------+| id | u |+----+------+| 1 | 20 |+----+------+mysql> replace into foo (u) values (20);mysql> select * from foo;+----+------+| id | u |+----+------+| 3 | 20 |+----+------+