# MySQL: Kopieren eines Datensatzes mit Primary Key



## Mik3e (20. Juni 2005)

Guten Morgen zusammen!

Ich stehe vor dem Problem, einen Datensatz innerhalb einer Tabelle mit allen Feldern 1:1 kopieren zu müssen. Das Problem dabei ist der Primärschlüssel.

Hier die Tabelle (vereinfachtes Beispiel):

```
# tabelle1
- pk_id (Primärschlüssel / künstlich - AUTO INCREMENT)
- bezeichnung (text)
```

Hier der SQL Query zum kopieren:

```
INSERT INTO 
`tabelle1`
SELECT * FROM 
`tabelle1`
WHERE `pk_id=1;
```
Geht klarerweise nicht, da er bei diesem Query auch den Primary Key kopiert. Man könnte jetzt natürlich nun alle Felder außer dem Primärschlüssel explizit selectieren. Das möchte ich aber vermeiden, da sich die Attribute der Tabelle nachträglich noch ändern können.

*Kennt Ihr vielleicht einen Kniff, um den Datensatz komplett zu duplizieren, ohne den Primärschlüssel mitzunehmen?*

Danke & LG
Mike


----------



## Frankdfe (20. Juni 2005)

Hallo Mike!

Du könntest das wie folgt lösen (habe ich nicht getestet):


```
INSERT INTO  tabelle1 (beschreibung, spalte3, spalte4)
SELECT beschreibung, spalte3, spalte4
FROM tabelle1;
```


----------



## Mik3e (20. Juni 2005)

Hi!

Genau das möchte ich eben nicht (die Attribute einzeln deklarieren). Das es so funktioniert, ist mir klar. Die Problematik ist, dass man sämtliche Funktionen und Methoden aktualisierne muss, wenn sich an der Tabelle auch nur ein Attribut ändert.

LG
Mike


----------



## Burkin (26. Juni 2005)

Hi

Nur mySQL oder auch PHP oder Perl bzw eine andere Programiersprache

Wenn andere Programmiersprache dann hab ich folgende Lösung für Dich:
1. SHOW Columns FROM Tabelle
Damit bekommst Du ein Array bestehend aus allen Spalte zurück incl. der Spaltenbezeichnung und auch des Datentyps
Also in der Zeile steht an der Stelle 0 die Spaltenbezeichnung.
Diese kannst Du dann in ein Array einlesen und genauso wieder auslesen
Damit stimmt Reihenfolge der Spalten in der Ziel- und Quelltabelle auch dann überein wenn sich die Struktur der Quelltabelle ändert
Damit ist es möglich das SQL-Statement von Frankdfe zu nutzen.

Gruß Burkhard


----------

