[MySQL] Datensatz duplizieren

N0ACE

Mitglied
Schönen guten Morgen allerseits!


Ich habe den Fall, dass man einen MySQL-Datansatz über eine Weboberfläche dublizieren können muss.

Mein bisheriger Ansatz sieht folgendermaßen aus:
PHP:
<?php
	global $IN, $DB, $REGX;
	
	$id =    $DB->escape_str($REGX->xss_clean($IN->GBL('id', 'POST')));
	$table = $DB->escape_str($REGX->xss_clean($IN->GBL('table', 'POST')));

	$query = $DB->query("INSERT INTO {$table}
		SELECT * FROM {$table} AS to_copy
		WHERE to_copy.id = {$id}
		ON duplicate key
		UPDATE id = id + 1");	

	$json['entry_id'] = $DB->insert_id;


	if ($query)
	{
		$json['status'] = 'copied';
	}
	else
	{
		$json['status'] = 'error';
		$json['sql'] = $sql;
	}
	
				
	echo utf8_encode(json_encode($json));
?>

Daraufhin folgt aber folgender MySQL Error:

Code:
Error Number: 1052
Description: Unknown column 'id' in 'field list'
Query: INSERT INTO foobar
	SELECT * FROM foobar AS to_copy
	WHERE to_copy.id = 393
	ON duplicate key
	UPDATE id = id + 1


Ich könnte zwar statt des "SELECT *" ein "SELECT field_1, field_2, ... field_n" nehmen und dabei das Feld "id" aussparen, aber es wäre schon schneller + einfacher, würde man alles selektieren, da ich circa 20 verschiedene Tabellenstrukturen habe und so dann erstmal durch eine "switch/case"-Geschichte laufen müsste um den entsprechenden Query zu nutzen, da jede dieser 20 Tabellen eine andere Struktur besitzt.

Daher meine Frage: Wie bekomme ich den "SELECT *"-Query vernünftig zum laufen, sodass wirklich die komplette Zeile dubliziert wird (Ausnahme: Das "id"-Feld) ?


Vielen Dank im voraus für eure Tipps!

(PS.: Ja, ich bin mir über die Tatsache von redundanten Daten et cetera bewusst, brauche diese Funktionalität aber :) )
 
Zuletzt bearbeitet:
Hi,

Ich könnte zwar statt des "SELECT *" ein "SELECT field_1, field_2, ... field_n" nehmen und dabei das Feld "id" aussparen[...]

Das wirst Du wohl müssen, denn

If you specify ON DUPLICATE KEY UPDATE, and a row is inserted that would cause a duplicate value in a UNIQUE index or PRIMARY KEY, an UPDATE of the old row is performed.

Heißt, in dem Fall wird überhaupt keine neue Zeile eingefügt, sondern die alte geändert.

LG
 
Zurück