Frage Wie legen Sie einen Standardwert für eine Spalte von MySQL Datetime fest?


Wie legen Sie einen Standardwert für eine Spalte von MySQL Datetime fest?

In SQL Server ist es getdate(). Was ist das Äquivalent für MySQL? Ich verwende MySQL 5.x, wenn das ein Faktor ist.


761
2017-10-03 20:24


Ursprung


Antworten:


WICHTIG EDITIEREN: Dies ist jetzt mit DATETIME-Feldern seither möglich MySQL 5.6.5Sieh dir die. an anderer Beitrag unten...

Frühere Versionen können das nicht mit DATETIME ...

Aber Sie können es mit TIMESTAMP tun:

mysql> create table test (str varchar(32), ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
Query OK, 0 rows affected (0.00 sec)

mysql> desc test;
+-------+-------------+------+-----+-------------------+-------+
| Field | Type        | Null | Key | Default           | Extra |
+-------+-------------+------+-----+-------------------+-------+
| str   | varchar(32) | YES  |     | NULL              |       | 
| ts    | timestamp   | NO   |     | CURRENT_TIMESTAMP |       | 
+-------+-------------+------+-----+-------------------+-------+
2 rows in set (0.00 sec)

mysql> insert into test (str) values ("demo");
Query OK, 1 row affected (0.00 sec)

mysql> select * from test;
+------+---------------------+
| str  | ts                  |
+------+---------------------+
| demo | 2008-10-03 22:59:52 | 
+------+---------------------+
1 row in set (0.00 sec)

mysql>

** CAVEAT: Wenn Sie eine Spalte mit CURRENT_TIMESTAMP ON als Standard definieren, müssen Sie IMMER einen Wert für diese Spalte angeben, oder der Wert wird beim Update automatisch auf "now ()" zurückgesetzt. Das bedeutet, wenn Sie den Wert nicht ändern möchten, muss Ihre UPDATE-Anweisung "[Ihr Spaltenname] = [Ihr Spaltenname]" (oder ein anderer Wert) enthalten oder der Wert wird "now ()". Seltsam, aber wahr. Ich hoffe das hilft. Ich benutze 5.5.56-MariaDB **


750
2017-10-03 20:48



In Version 5.6.5 ist es möglich, einen Standardwert für eine Datetime-Spalte festzulegen und sogar eine Spalte zu erstellen, die aktualisiert wird, wenn die Zeile aktualisiert wird. Die Typdefinition:

CREATE TABLE foo (
    `creation_time`     DATETIME DEFAULT CURRENT_TIMESTAMP,
    `modification_time` DATETIME ON UPDATE CURRENT_TIMESTAMP
)

Referenz: http://optimize-this.blogspot.com/2012/04/datetime-default-now-finally-available.html


492
2018-05-15 14:44



MySQL (vor Version 5.6.5) erlaubt keine Funktionen für Standard-DateTime-Werte. TIMESTAMP ist aufgrund seines seltsamen Verhaltens nicht geeignet und wird nicht zur Verwendung als Eingabedaten empfohlen. (Sehen Standardeinstellungen für den MySQL-Datentyp.)

Das heißt, Sie können dies erreichen durch Erstellen eines Triggers.

Ich habe eine Tabelle mit einem DateCreated-Feld vom Typ DateTime. Ich habe einen Trigger für diese Tabelle "Vor dem Einfügen" und "SET NEW.DateCreated=NOW()"Und es funktioniert großartig.

Ich hoffe, das hilft jemandem.


135
2017-09-27 17:04



Für mich hat der Trigger-Ansatz am besten funktioniert, aber ich habe einen Haken bei der Vorgehensweise gefunden. Betrachten Sie den grundlegenden Auslöser, um ein Datumsfeld auf die aktuelle Zeit beim Einfügen festzulegen:

CREATE TRIGGER myTable_OnInsert BEFORE INSERT ON `tblMyTable`
    FOR EACH ROW SET NEW.dateAdded = NOW();

Das ist normalerweise großartig, aber sagen Sie, dass Sie das Feld manuell über INSERT-Anweisung wie folgt festlegen möchten:

INSERT INTO tblMyTable(name, dateAdded) VALUES('Alice', '2010-01-03 04:30:43');

Was passiert, ist, dass der Trigger den von Ihnen bereitgestellten Wert für das Feld sofort überschreibt. Daher ist die einzige Möglichkeit, eine nicht aktuelle Zeit festzulegen, eine UPDATE-Folgeanweisung - yuck! Um dieses Verhalten zu überschreiben, wenn ein Wert angegeben wird, versuchen Sie diesen leicht modifizierten Trigger mit dem IFNULL-Operator:

CREATE TRIGGER myTable_OnInsert BEFORE INSERT ON `tblMyTable`
    FOR EACH ROW SET NEW.dateAdded = IFNULL(NEW.dateAdded, NOW());

Dies gibt das Beste aus beiden Welten: Sie können einen Wert für Ihre Datumsspalte angeben, und es wird dauern, ansonsten wird die aktuelle Zeit standardmäßig verwendet. Es ist immer noch Ghetto relativ zu etwas sauber wie DEFAULT GETDATE () in der Tabellendefinition, aber wir kommen näher!


127
2018-04-20 14:12



Ich konnte das lösen, indem ich diese Alter-Anweisung in meiner Tabelle verwendete, die zwei Datetime-Felder hatte.

ALTER TABLE `test_table`
  CHANGE COLUMN `created_dt` `created_dt` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
  CHANGE COLUMN `updated_dt` `updated_dt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

Dies funktioniert so, wie Sie es von der Funktion now () erwarten würden. Das Einfügen von Nullen oder das Ignorieren der Felder created_dt und updated_dt ergibt in beiden Feldern einen perfekten Zeitstempelwert. Jede Aktualisierung der Zeile ändert die aktualisierte_Dt. Wenn Sie Datensätze über den MySQL Query Browser einfügen, benötigen Sie einen weiteren Schritt, einen Trigger, um die created_dt mit einem neuen Zeitstempel zu behandeln.

CREATE TRIGGER trig_test_table_insert BEFORE INSERT ON `test_table`
    FOR EACH ROW SET NEW.created_dt = NOW();

Der Trigger kann sein, was immer Sie wollen Ich mag die Namenskonvention [trig] _ [my_table_name] _ [einfügen]


22
2018-02-12 17:44



Sie können Auslöser verwenden, um diese Art von Sachen zu machen.

CREATE TABLE `MyTable` (
`MyTable_ID`  int UNSIGNED NOT NULL AUTO_INCREMENT ,
`MyData`  varchar(10) NOT NULL ,
`CreationDate`  datetime NULL ,
`UpdateDate`  datetime NULL ,
PRIMARY KEY (`MyTable_ID`)
)
;

CREATE TRIGGER `MyTable_INSERT` BEFORE INSERT ON `MyTable`
FOR EACH ROW BEGIN
        -- Set the creation date
    SET new.CreationDate = now();

        -- Set the udpate date
    Set new.UpdateDate = now();
END;

CREATE TRIGGER `MyTable_UPDATE` BEFORE UPDATE ON `MyTable`
FOR EACH ROW BEGIN
        -- Set the udpate date
    Set new.UpdateDate = now();
END;

22
2018-06-22 17:32



Für alle, die das Herz verloren haben und versucht haben, einen Standard zu setzen TERMINZEIT Wert in MySQLIch weiß genau, wie du dich fühlst. Also hier ist:

ALTER TABLE  `table_name` CHANGE `column_name` DATETIME NOT NULL DEFAULT 0

Achte genau darauf Ich habe keine einfachen Anführungszeichen / Anführungszeichen hinzugefügt um die 0

Ich springe buchstäblich nach dem Lösen dieses: D


13
2018-03-10 18:38



Das sind in der Tat schreckliche Nachrichten.Hier ist eine lange ausstehende Bug / Feature-Anfrage dafür. Diese Diskussion spricht auch über die Beschränkungen des Zeitstempeldatentyps.

Ich frage mich ernsthaft, was ist das Problem mit der Umsetzung dieses Dinges?


12
2018-02-21 21:28



MySQL 5.6 hat dieses Problem behoben.

ALTER TABLE mytable CHANGE mydate datetime NOT NULL DEFAULT 'CURRENT_TIMESTAMP'

12
2017-08-06 10:13



Für alle, die die TIMESTAMP-Spalte als Lösung verwenden, möchte ich die folgende Einschränkung aus dem Handbuch absegnen:

http://dev.mysql.com/doc/refman/5.0/en/datetime.html

"Der Datentyp TIMESTAMP hat einen Bereich von '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' KOORDINIERTE WELTZEIT. Abhängig von der MySQL-Version und dem SQL-Modus, in dem der Server ausgeführt wird, hat er unterschiedliche Eigenschaften. Diese Eigenschaften werden später in diesem Abschnitt beschrieben. "

Das wird Ihre Software in ungefähr 28 Jahren zerstören.

Ich glaube, die einzige Lösung auf der Datenbankseite ist die Verwendung von Triggern wie in anderen Antworten erwähnt.


7
2017-12-07 14:31



Wenn Sie die Tabelle bereits erstellt haben, können Sie sie verwenden

So ändern Sie den Standardwert in die aktuelle Datumszeit

ALTER TABLE <TABLE_NAME> 
CHANGE COLUMN <COLUMN_NAME> <COLUMN_NAME> DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;

So ändern Sie den Standardwert auf "2015-05-11 13:01:01"

ALTER TABLE <TABLE_NAME> 
CHANGE COLUMN <COLUMN_NAME> <COLUMN_NAME> DATETIME NOT NULL DEFAULT '2015-05-11 13:01:01';

7
2017-10-03 20:30