Duplikere og ignorere på MySQL-indlæg
MySQL-tabel primære nøgler og unikke indekser forhindrer flere rækker med samme indeks fra at blive tilføjet til tabellen. Hvis du forsøger at indsætte en dublet række med en standard INSERT-sætning, vil du støde på en fejl, og indsætningen mislykkes.
MySQL giver flere alternativer til standard INSERT-sætningen, og hver håndterer dobbelte rækker lidt anderledes: "INSERT IGNORE", "INSERT ... ON DUPLICATE KEY UPDATE" og "REPLACE."
Primærnøgler og unikke indekser
Primær nøgleindekser og "UNIQUE" indeksbegrænsninger kræver, at hver række indeholder en unik værdi i indekskolonnen (s), så hver række kan identificeres med sin primære nøgle eller værdien i UNIQUE indeksbegrænsningskolonnen (r).
Hvis en normal INSERT forsøger at indsætte en række, der indeholder en duplikatværdi i primærnøglen eller UNIQUE-begrænsningsindekset, vil indsætningen mislykkes, muligvis rullende tilbage hele transaktionen.
INSERT IGNORE
INSERT IGNORE vil indsætte rækker på samme måde som INSERT, men med den undtagelse, at det vil ignorere rækker med dobbeltværdier og fortsætte eksekveringen uden at skabe en fejl. Enhver række, der indeholder en dobbeltværdi, vil ikke blive indsat; for eksempel:
INSERT IGNORE TIL my_table (unique_index_column, other_column) VÆRDIER (1, 'anden værdi');
INDSÆT ... OM DUPLICERENDE Nøgleopdatering
INSERT ... PÅ DUPLICATE KEY UPDATE vil indsætte eventuelle ikke-duplikat rækker som normalt. Men når den møder en dobbelt række, udfører den en UPDATE på den oprindelige række; for eksempel:
Indtast i my_table (unique_index_column, other_column) VÆRDIER (1, 'anden værdi') PÅ DUPLICER Nøgle UPDATE other_column = 'duplicate update value';
ERSTATTE
REPLACE fungerer det samme som INSERT, bortset fra at når det møder en duplikeret række, sletter den den oprindelige række og fortsætter derefter med indsætningen. Enhver række med en dobbelt unikke indeksværdi erstatter rækken, der oprindeligt indeholdt værdien; for eksempel:
Udskift til my_table (unique_index_column, other_column) VÆRDIER (1, 'anden værdi')