Warum kann es in der DEFAULT- oder ON UPDATE-Klausel nur eine TIMESTAMP-Spalte mit CURRENT_TIMESTAMP geben?
CREATE TABLE `foo` (
`ProductID` INT(10) UNSIGNED NOT NULL,
`AddedDate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`UpdatedDate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=INNODB;
Der daraus resultierende Fehler:
Fehlercode: 1293
Falsche Tabellendefinition; Es kann nur eine TIMESTAMP-Spalte mit CURRENT_TIMESTAMP in der DEFAULT- oder ON UPDATE-Klausel geben
mysql
timestamp
mysql-error-1293
ripper234
quelle
quelle
CURRENT_TIMESTAMP
inDEFAULT
oderON UPDATE
-Klausel nicht definierenTIMESTAMP
, wenn es eine Spalte mit Datentyp gibt, unabhängig davon, ob sie eine zusätzliche Klausel enthält!CREATE TABLE foo (created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_on TIMESTAMP)
aber nicht diese:CREATE TABLE foo (updated_on TIMESTAMP, created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP)
timestamp
Spalte nullbar ist, dhnull
. Wenn die erstetimestamp
Spaltenot null
dann standardmäßig istDEFAULT CURRENT_TIMESTAMP
undON UPDATE CURRENT_TIMESTAMP
hinzugefügt wird. stackoverflow.com/a/13544181/2859238timestamp
Spalte ein expliziter Standardwert wie festgelegt istdefault '0000-00-00 00:00:00'
. Wenn die Spalte NULL - Werte zulässt oder explizit Standardwert festgelegt ist, dannDEFAULT CURRENT_TIMESTAMP
undON UPDATE CURRENT_TIMESTAMP
wird nicht hinzugefügt werdenAntworten:
Diese Einschränkung, die nur aus historischen Gründen des Code-Legacy bestand, wurde in neueren Versionen von MySQL aufgehoben:
http://dev.mysql.com/doc/relnotes/mysql/5.6/en/news-5-6-5.html
quelle
Das habe ich mich auch schon vor langer Zeit gefragt. Ich habe ein bisschen in meiner Geschichte gesucht und denke, dass dieser Beitrag: http://lists.mysql.com/internals/34919 die halboffizielle Position von MySQL darstellt (vor der Intervention von Oracle;))
Zusamenfassend:
Ihre Erklärung lautet also "weil es so implementiert ist". Klingt nicht sehr wissenschaftlich. Ich denke, alles kommt von einem alten Code. Dies wird im obigen Thread vorgeschlagen: "Übertragung von, als nur das erste Zeitstempelfeld automatisch gesetzt / aktualisiert wurde".
Prost!
quelle
Wir können einen Standardwert für den Zeitstempel angeben, um dieses Problem zu vermeiden.
Dieser Beitrag enthält eine detaillierte Problemumgehung: http://gusiev.com/2009/04/update-and-create-timestamps-with-mysql/
quelle
In der Tat ein Implementierungsfehler.
Der native Ansatz in MySQL besteht darin, ein Erstellungsdatum selbst zu aktualisieren (falls Sie eines benötigen) und MySQL sich über den Zeitstempel
update date ? update date : creation date
wie folgt Gedanken zu machen :Bei der Erstellung NULL einfügen:
NULL-Werte für den Zeitstempel werden standardmäßig als CURRENT_TIMESTAMP interpretiert.
In MySQL erhält die erste TIMESTAMP-Spalte einer Tabelle sowohl das Attribut
DEFAULT CURRENT_TIMESTAMP
als auch dasON UPDATE CURRENT_TIMESTAMP
Attribut, wenn keine Attribute dafür angegeben sind. Aus diesem Grund muss die TIMESTAMP-Spalte mit den Attributen an erster Stelle stehen. Andernfalls wird der in diesem Thread beschriebene Fehler angezeigt.quelle
Sowie:
quelle
Eine Lösung für Sie könnte darin bestehen, es in das Feld UpdatedDate einzufügen und einen Trigger zu haben, der das Feld AddedDate nur dann mit dem Wert UpdatedDate aktualisiert, wenn AddedDate null ist.
quelle
Verschiedene Antworten kombinieren:
In MySQL 5.5
DEFAULT CURRENT_TIMESTAMP
undON UPDATE CURRENT_TIMESTAMP
kann nicht hinzugefügt werden,DATETIME
sondern nur aufTIMESTAMP
.Regeln:
1) höchstens eine
TIMESTAMP
Spalte pro Tabelle kann automatisch (oder manuell [ Meine Hinzufügung ]) initialisiert oder auf das aktuelle Datum und die aktuelle Uhrzeit aktualisiert werden. (MySQL Docs).Also nur eine
TIMESTAMP
haben kannCURRENT_TIMESTAMP
inDEFAULT
oderON UPDATE
Klausel2) Die erste
NOT NULL
TIMESTAMP
Spalte ohne einen explizitenDEFAULT
Wert wiecreated_date timestamp default '0000-00-00 00:00:00'
implizit eine gegeben werdenDEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
und somit nachfolgendeTIMESTAMP
Spalten können nicht gegeben werdenCURRENT_TIMESTAMP
aufDEFAULT
oderON UPDATE
KlauselAndere Option (aber
updated_date
ist die erste Spalte):quelle
Versuche dies:
quelle
created_at
Spalte selbst festlegen . Ich denke, das ist es, was ich absichtlich sagen möchte.Dies ist die Einschränkung in der MYSQL 5.5-Version. Sie müssen die Version auf 5.6 aktualisieren.
Ich habe diesen Fehler beim Hinzufügen einer Tabelle in MYSQL erhalten
Tisch sieht ungefähr so aus.
Nach einiger Zeit des Lesens über Änderungen in verschiedenen MYSQL-Versionen und einige der googeln. Ich fand heraus, dass in MYSQL Version 5.6 gegenüber Version 5.5 einige Änderungen vorgenommen wurden.
Dieser Artikel hilft Ihnen bei der Behebung des Problems. http://www.oyewiki.com/MYSQL/Incorrect-table-definition-there-can-be-only-one-timestamp-column
quelle