Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Kann ich ON DUPLICATE KEY UPDATE mit einer INSERT-Abfrage unter Verwendung der SET-Option verwenden?

Ich habe ON DUPLICATE KEY UPDATE verwendet eine Menge. In einigen Situationen ist es eine nicht standardmäßige SQL-Erweiterung, die es wirklich wert ist, verwendet zu werden.

Zuerst müssen Sie sicherstellen, dass Sie eine eindeutige Schlüsselbeschränkung haben. Der ON DUPLICATE KEY UPDATE Funktion tritt nur ein, wenn es eine eindeutige Schlüsselverletzung gegeben hätte.

Hier ist ein häufig verwendetes 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) bedeutet "Spalte1 mit dem Wert aktualisieren, der eingefügt worden wäre, wenn die Abfrage die Verletzung des doppelten Schlüssels nicht getroffen hätte." Mit anderen Worten, es bedeutet nur, Spalte1 auf das zu aktualisieren, was sie gewesen wäre, wenn die Einfügung funktioniert hätte.

Wenn Sie sich diesen Code ansehen, scheint es nicht richtig zu sein, dass Sie alle drei Spalten aktualisieren, die Sie einfügen möchten. Welche der Spalten hat eine eindeutige Einschränkung?

BEARBEITEN:Ändern Sie basierend auf dem SET-Format der MySQL-Einfügeanweisung gemäß der Frage aus dem OP.

Grundsätzlich zu verwenden ON DUPLICATE KEY UPDATE schreiben Sie einfach die Insert-Anweisung wie gewohnt, fügen aber den ON DUPLICATE KEY UPDATE hinzu Satz am Ende angehängt. Ich glaube, es sollte so funktionieren:

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);

Auch hier muss eine der Spalten, die Sie einfügen, einen eindeutigen Index (oder eine Kombination der Spalten) haben. Das kann daran liegen, dass einer davon der Primärschlüssel ist oder dass es einen eindeutigen Index für die Tabelle gibt.