SQL: INSERT INTO tabelle ON DUPLICATE KEY UPDATE

edit | delete

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