Marko: SQL Abfrage: Zeile + Zeitstempel in Archivtabelle Schaufeln

Hallo Leute,

ein kleines MYSQL Problem:

Ich Habe eine Tabelle, auf der ein Datensatz öfter mal geändert wird, die Änderungen sollen dadurch protokolliert werden, das vor der Änderung der Datensatz in eine andere Tabelle kopiert wird, die genau die gleichen Felder hat.
Solange die Tabellen die gleichen Felder haben funktioniert zum kopieren einer Zeile:

INSERT INTO tabelle2 SELECT ... FROM tabelle1;

Nun sollen aber in Tabelle2 mehrere Versionen des Datensatzes gehalten werden können, weshalb im Primärindex Duplikate auftreten können. Daraus folgt, der Primärindex ist keiner mehr, dafür soll ein Zeitstempel der neue Primärindex sein.
Nun gibt aber das obige INSERT Statement logischerweise die folgende Fehlermeldung:

ERROR 1136: Column count doesn't match value count at row 1

Frage: Wie drücke ich in SQL einfach aus, das die zusätzliche Spalte ein Zeitstempel ist, und die anderen einfach übernommen werden sollen, wie bei der obigen Abfrage ???

Vielen Dank und Gruss

Marko

  1. Hallo Marko,

    INSERT INTO tabelle2 SELECT ... FROM tabelle1;

    [...]

    ERROR 1136: Column count doesn't match value count at row 1

    Das Problem, das du hast, ist, dass bei dieser Form der INSERT-Abfrage die Anzahl der einzufügenden Spalten genauso gross sein muss, wie die Anzahl der vorhandenen Spalten in der neuen Tabelle. Da du jedoch in der neuen Tabelle eine Spalte mehr hast (den Zeitstempel), funktioniert das ganze so nicht.

    Hier am besten folgende Syntax verwenden:

    INSERT INTO tabelle2 (Spalte2, Spalte3, Spalte4, Spalte5) SELECT Spalte1, Spalte2, Spalte3, Spalte4 FROM tabelle1 WHERE ...

    Für den Fall, dass Spalte1 der Tabelle2 ein AUTO_INCREMENT Feld ist, wird dieses automatisch erzeugt. Aber auch, wenn diese Spalte als TIMESTAMP definiert wurde, wird automatisch der Zeitstempel, zu dem der INSERT stattfindet generiert und in die Spalte abgelegt. Eine TIMESTAMP Spalte wird immer auf das aktuelle Datum und die aktuelle Zeit gesetzt, wenn NULL eingetragen wird. (Was ja in unserem Fall passiert, da die Spalte1 der Tabelle2 nicht befüllt wird).

    WICHTIG: Dies funktioniert nur, wenn Spalte1 der Tabelle2 als einzige oder als erste Spalte der Tabelle2 als TIMESTAMP definiert wurde.

    Liebe Gruesse
    Martin