SQL: INSERT INTO tabelle ON DUPLICATE KEY UPDATE
Autor: Varsamis Karamanidis (Macky), Ralf v.d.Mark
eingetragen: Montag, 03. Mai 2021 um 15:51 Uhr (18/2021 Kalenderwoche)
geändert: Samstag, 17. Januar 2026 um 00:09 Uhr (3/2026 Kalenderwoche)
Keywords: INSERT INTO tabelle DUPLICATE UPDATE speichern schreiben vorhanden ÄNDERN
Kategorien: DB: MySQL, DB: MariaDB,
Text:
Daten NEU schreiben, wenn vorhanden ÄNDERN
INSERT INTO tabelle ON DUPLICATE KEY UPDATE
Wichtig ist immer, dass es einen Unique-Constaint oder einen Primay-Key auf die Felder gibt.
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.
siehe auch PHP-Abfrage der Ergebnisse (Artikel 264)
Quellcode:
-- Query 1:
INSERT INTO `form_feld_typ`
(`id`, `typ_txt`, `typ_update`)
VALUES
(100, 'Einzeiliges Textfeld', '2024-11-19 13:12:46')
ON DUPLICATE KEY UPDATE
typ_txt=VALUES(typ_txt),
typ_update=VALUES(typ_update);
-- --------------------------------------------
-- Query 2:
INSERT INTO fpd.f_foprojekt_ministeriumsreferat_verkn
(foprojekt_id, ministerium_referate_id, update_ts)
SELECT ext.pa_id, ext.rm_ministerium_referate_id, ext.pk_update_timestamp
FROM fpd.a_daten4import AS ext
INNER JOIN fpd.viewipa_ministerium_referate ref ON (ref.id = ext.rm_ministerium_referate_id)
INNER JOIN fpd.f_foprojekt prjkt ON (prjkt.id = ext.pa_id)
WHERE (ext.it_datensatz_fertig = 55
OR ext.it_datensatz_fertig = 66)
ON DUPLICATE KEY UPDATE
foprojekt_id = ext.pa_id,
ministerium_referate_id = ext.rm_ministerium_referate_id,
update_ts = ext.qt_update_zeitpunkt
;
-- --------------------------------------------
-- Query 3:
INSERT INTO datenbank.tabelle
(feld1, feld2, feld3, feld4, feld5, feld6)
VALUES
(3, 3, 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);
-- --------------------------------------------
-- Query 4:
$updateOderInsert = '
INSERT INTO datenbank.tabelle (
'.DbTable_Tabelle::COL_FELD_1.',
'.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.');';