“Inserire IGNORE” VS “Inserisci” VS “Inserisci … in Aggiorna il tasto duplicato”

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 o UNIQUE Restrizioni.
  • Inserire un null in una colonna con un NOT NULL restrizione “>

.

  • Inserire una riga in una tabella di partizione, ma i valori che inseriscono non sono assegnati a una partizione.
  • 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 |+----+------+

    Lascia un commento

    Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *