# [MySQL] Datensatz duplizieren



## N0ACE (25. April 2009)

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
	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: 


```
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  )


----------



## kuddeldaddeldu (25. April 2009)

Hi,



N0ACE hat gesagt.:


> 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


----------

