Ich habe das folgende Tabellenschema;
CREATE TABLE `db1`.`sms_queue` (
`Id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`Message` VARCHAR(160) NOT NULL DEFAULT 'Unknown Message Error',
`CurrentState` VARCHAR(10) NOT NULL DEFAULT 'None',
`Phone` VARCHAR(14) DEFAULT NULL,
`Created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`LastUpdated` TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP,
`TriesLeft` tinyint NOT NULL DEFAULT 3,
PRIMARY KEY (`Id`)
)
ENGINE = InnoDB;
Es schlägt mit folgendem Fehler fehl:
ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause.
Meine Frage ist, kann ich beide Felder haben? oder muss ich bei jeder Transaktion manuell ein LastUpdated-Feld festlegen?
mysql
mysql-error-1293
Xenph Yan
quelle
quelle
Antworten:
Aus der MySQL 5.5- Dokumentation :
Änderungen in MySQL 5.6.5 :
quelle
Changes in MySQL 5.6.5 (2012-04-10, Milestone 8) Previously, at most one TIMESTAMP column per table could be automatically initialized or updated to the current date and time. This restriction has been lifted. Any TIMESTAMP column definition can have any combination of DEFAULT CURRENT_TIMESTAMP and ON UPDATE CURRENT_TIMESTAMP clauses. In addition, these clauses now can be used with DATETIME column definitions. For more information, see Automatic Initialization and Updating for TIMESTAMP and DATETIME.
Es gibt einen Trick , beide Zeitstempel zu haben, aber mit einer kleinen Einschränkung.
Sie können nur eine der Definitionen in einer Tabelle verwenden. Erstellen Sie beide Zeitstempelspalten wie folgt:
Beachten Sie, dass Sie
null
in beide Spalten eingeben müssen , währendinsert
:quelle
stamp_created
auch als NOT NULL festgelegt ist. MySQL ersetzt automatisch NULL durch den aktuellen Zeitstempel.stamp_created
Feld nicht auch wiestamp_created timestamp default now()
folgt : anstatt einen 'ZERO'-Wert zu verwenden?Sie können beide haben, entfernen Sie einfach das Flag "CURRENT_TIMESTAMP" im erstellten Feld. Wenn Sie einen neuen Datensatz in der Tabelle erstellen, verwenden Sie einfach "NOW ()" für einen Wert.
Oder.
Entfernen Sie im Gegenteil das Flag 'ON UPDATE CURRENT_TIMESTAMP' und senden Sie das NOW () für dieses Feld. Dieser Weg macht eigentlich mehr Sinn.
quelle
Wenn Sie sich dafür entscheiden, dass MySQL die Aktualisierung von Zeitstempeln übernimmt, können Sie einen Trigger einrichten, um das Feld beim Einfügen zu aktualisieren.
MySQL-Referenz: http://dev.mysql.com/doc/refman/5.0/en/triggers.html
quelle
So können Sie mithilfe von Triggern automatische und flexible createDate / lastModified-Felder erstellen:
Definieren Sie sie zuerst so:
Fügen Sie dann diese Trigger hinzu:
Aber hier ist der schöne Teil:
quelle
Ab MySQL 5.6 ist es einfach ... probieren Sie es aus:
quelle
Dieses Problem schien in MySQL 5.6 behoben worden zu sein. Ich habe dies bis MySQL 5.5 bemerkt; Hier ist ein Beispielcode:
Wenn Sie dies unter MySQL 5.5 ausführen, erhalten Sie:
Führen Sie dies unter MySQL 5.6 aus
quelle
Quelle: http://gusiev.com/2009/04/update-and-create-timestamps-with-mysql/
quelle
Für MySQL 5.7.21 verwende ich Folgendes und funktioniert gut:
CREATE TABLE
Posts
(modified_at
Zeitstempel NICHT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,created_at
Zeitstempel NICHT NULL DEFAULT CURRENT_TIMESTAMP)quelle
Ich denke, dies ist die bessere Abfrage für stamp_created und stamp_updated
denn wenn der Datensatz erstellt wird,
stamp_created
sollte gefüllt werden vonnow()
undstamp_updated
sollte gefüllt werden von'0000-00-00 00:00:00'
quelle
Mein Webhost steckt in Version 5.1 von MySQL fest, sodass jeder wie ich, der keine Upgrade-Option hat, die folgenden Anweisungen befolgen kann:
http://joegornick.com/2009/12/30/mysql-created-and-modified-date-fields/
quelle