Daten NEU schreiben, wenn vorhanden ÄNDERN

edit | delete

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