Mysql
 sql >> Database >  >> RDS >> Mysql

SU CHIAVE DUPLICATA + AUTO INCREMENT problema mysql

Questo comportamento è documentato (paragrafo tra parentesi):

Se si specifica ON DUPLICATE KEY UPDATE e viene inserita una riga che causerebbe un valore duplicato in un indice UNIQUE o PRIMARY KEY, MySQL esegue un UPDATE della vecchia riga. Ad esempio, se la colonna a viene dichiarata UNICA e contiene il valore 1, le seguenti due affermazioni hanno un effetto simile:

    INSERT INTO table (a,b,c) VALUES (1,2,3)   ON DUPLICATE KEY UPDATE c=c+1;

    UPDATE table SET c=c+1 WHERE a=1;

(Gli effetti non sono identici per una tabella InnoDB dove a è una colonna di incremento automatico. Con una colonna di incremento automatico, un'istruzione INSERT aumenta il valore di incremento automatico ma UPDATE no.)

Ecco una semplice spiegazione. MySQL tenta di eseguire prima l'inserimento. Questo è quando l'ID viene incrementato automaticamente. Una volta incrementato, rimane. Quindi il duplicato viene rilevato e viene eseguito l'aggiornamento. Ma il valore si perde.

Non dovresti dipendere da auto_increment non avendo lacune. Se questo è un requisito, l'overhead per gli aggiornamenti e gli inserimenti è molto maggiore. In sostanza, è necessario inserire un blocco sull'intera tabella e rinumerare tutto ciò che deve essere rinumerato, in genere utilizzando un trigger. Una soluzione migliore è calcolare i valori incrementali sull'output.