Jeg har brugt ON DUPLICATE KEY UPDATE
en masse. I nogle situationer er det ikke-standard SQL-udvidelse, der virkelig er værd at bruge.
Først skal du sikre dig, at du har en unik nøglebegrænsning på plads. ON DUPLICATE KEY UPDATE
Funktionen starter kun, hvis der ville have været en unik nøgleovertrædelse.
Her er et almindeligt brugt format:
$query = "INSERT INTO $table (column1, column2, column3)
VALUES ('value-1', 'value-2', 'value-3')
ON DUPLICATE KEY UPDATE
column1 = values(column1),
column2 = values(column2),
column3 = values(column3);"
column1 = values(column1)
betyder "Opdater kolonne1 med den værdi, der ville være blevet indsat, hvis forespørgslen ikke havde ramt overtrædelsen af dubletnøgle." Med andre ord betyder det blot, at du skal opdatere kolonne 1 til, hvad det ville have været, hvis indsatsen havde fungeret.
Ser man på denne kode, virker det ikke korrekt, at du opdaterer alle tre kolonner, du forsøger at indsætte. Hvilken af kolonnerne har en unik begrænsning?
EDIT:Rediger baseret på 'SET'-formatet af mysql-indsæt-sætningen i henhold til spørgsmålet fra OP.
Grundlæggende at bruge ON DUPLICATE KEY UPDATE
, du skriver bare insert-sætningen, som du plejer, men tilføjer ON DUPLICATE KEY UPDATE
klausul sat på slutningen. Jeg tror, det skal fungere sådan her:
INSERT INTO $table
set column1 = 'value-1',
column2 = 'value-2',
column3 = 'value-3'
ON DUPLICATE KEY UPDATE
column1 = values(column1),
column2 = values(column2),
column3 = values(column3);
Igen skal en af de kolonner, du indsætter, have et unikt indeks (eller en kombination af kolonnerne). Det kan være fordi en af dem er den primære nøgle, eller fordi der er et unikt indeks på bordet.