Daten NEU schreiben, wenn vorhanden ÄNDERN
Autor: Ralf v.d.Mark
eingetragen: Freitag, 14. Februar 2014 um 08:41 Uhr (7/2014 Kalenderwoche)
geändert: Freitag, 14. Februar 2014 um 08:41 Uhr (7/2014 Kalenderwoche)
Keywords: insert duplicate update
Kategorien: DB: MySQL, DB: MariaDB,
Text:
Wenn Sie ON DUPLICATE KEY UPDATE angeben und ein Datensatz eingefügt wird, der einen doppelten Wert in einem eindeutigen Index oder einem Primärschlüssel erzeugen würde, dann wird für den alten Datensatz UPDATE ausgeführt. Angenommen, die Spalte a wird als UNIQUE deklariert und enthält den Wert 1; in diesem Fall hätten die beiden folgenden Anweisungen dieselbe Wirkung:
INSERT INTO table (a,b,c)
VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
Das Update macht das gleiche wie:
UPDATE table SET c=c+1 WHERE a=1;
Weiter lesen....
http://dev.mysql.com/doc/refman/5.1/de/insert-on-duplicate.html
Der 2. Quellcode (Beispiel 2) zeigt eine Query die dynamisch von PHP erzeugt wird:
Quellcode:
-- Beispiel:
INSERT INTO datenbank.tabelle
(feld1, feld2, feld3, feld4, feld5, feld6)
VALUES
(3, 3, 0, 0, 1835, NOW()),
(3, 4, 0, 0, 1835, NOW()),
(3, 6, 0, 0, 1835, NOW()),
(3, 9, 0, 0, 1835, NOW()),
(5, 3, 0, 0, 1835, NOW()),
(6, 4, 0, 0, 1835, NOW()),
(3, 5, 0, 0, 1835, NOW()),
(6, 4, 0, 0, 1835, NOW()),
(3, 4, 0, 0, 1835, NOW()),
(14, 5, '1.5', 1, 1835, NOW())
ON DUPLICATE KEY UPDATE
feld1 = VALUES(feld1),
feld2 = VALUES(feld2),
feld3 = VALUES(feld3),
feld4 = 9, # Wenn Doppelt auf 9 wandeln
feld5 = VALUES(feld5),
feld6 = VALUES(feld6);
-- Beispiel 2
$updateOderInsert = '
INSERT INTO datenbank.tabelle (
'.DbTable_Tabelle::COL_FELD_1.',
'.DbTable_Tabelle::COL_FELD_2.',
'.DbTable_Tabelle::COL_FELD_3.',
'.DbTable_Tabelle::COL_FELD_4.',
'.DbTable_Tabelle::COL_FELD_5.',
'.DbTable_Tabelle::COL_FELD_6.')
VALUES
( '.$arr[DbTable_Quelle::COL_QUELLE_ID].',
'.$arr[DbTable_Quelle::COL_QUELLE_ID].',
0,
0,
'.$arr[DbTable_Quelle::COL_FK_ID].',
"'.$updateZeitpunkt.'"),
( '.$arr[DbTable_Quelle::COL_QUELLE_ID].',
'.$neueInstId.',
0,
0,
'.$arr[DbTable_Quelle::COL_FK_ID].',
"'.$updateZeitpunkt.'"),
( '.$arr[DbTable_Quelle::COL_QUELLE_ID].',
'.$neueRefrId.',
"'.$arr[DbTable_Quelle::COL_PT].'",
1,
'.$arr[DbTable_Quelle::COL_FK_ID].',
"'.$updateZeitpunkt.'")
ON DUPLICATE KEY UPDATE
'.DbTable_Tabelle::COL_FELD_1.' = VALUES('.DbTable_Tabelle::COL_FELD_1.'),
'.DbTable_Tabelle::COL_FELD_2.' = VALUES('.DbTable_Tabelle::COL_FELD_2.'),
'.DbTable_Tabelle::COL_FELD_3.' = VALUES('.DbTable_Tabelle::COL_FELD_3.'),
'.DbTable_Tabelle::COL_FELD_4.' = 1,
'.DbTable_Tabelle::COL_FELD_5.' = VALUES('.DbTable_Tabelle::COL_FELD_5.'),
'.DbTable_Tabelle::COL_FELD_6.' = VALUES('.DbTable_Tabelle::COL_FELD_6.');';