webentwicklung-frage-antwort-db.com.de

JETZT () als Standardwert für den Datetime-Datentyp festlegen?

Ich habe zwei Spalten in Tabellenbenutzern, nämlich registerDate and lastVisitDate, die aus dem Datetime-Datentyp bestehen. Ich möchte folgendes tun.

  1. Setzen Sie den Standardwert für registerDate auf MySQL NOW ().
  2. Legen Sie den lastVisitDate-Standardwert auf 0000-00-00 00:00:00 fest, anstatt den Wert, den er standardmäßig verwendet.

Da die Tabelle bereits existiert und bereits Datensätze enthält, möchte ich die Modify-Tabelle verwenden. Ich habe versucht, den Code unten zu verwenden, aber es funktioniert nicht. 

ALTER TABLE users MODIFY registerDate datetime DEFAULT NOW()
ALTER TABLE users MODIFY registerDate datetime DEFAULT CURRENT_TIMESTAMP;

Es gibt mir einen Fehler: ERROR 1067 (42000): Invalid default value for 'registerDate'

Kann ich den Standardwert für datetime in MySQL auf NOW () setzen?

177

Ab MySQL 5.6.5 können Sie den Typ DATETIME mit einem dynamischen Standardwert verwenden:

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

Oder kombiniere auch beide Regeln:

modification_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

Referenz:
http://dev.mysql.com/doc/refman/5.7/en/timestamp-initialization.html
http://optimize-this.blogspot.com/2012/04/datetime-default-now-finally-available.html

Vor 5.6.5 müssen Sie den Datentyp TIMESTAMP verwenden, der automatisch aktualisiert wird, wenn der Datensatz geändert wird. Leider kann nur ein automatisch aktualisiertes TIMESTAMP-Feld pro Tabelle vorhanden sein.

CREATE TABLE mytable (
  mydate TIMESTAMP
)

Siehe: http://dev.mysql.com/doc/refman/5.1/de/create-table.html

Wenn Sie verhindern möchten, dass MySQL den Zeitstempelwert für UPDATE aktualisiert (damit er nur bei INSERT ausgelöst wird), können Sie die Definition folgendermaßen ändern:

CREATE TABLE mytable (
  mydate TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
221
Johan

Ich benutze einen Auslöser als Workaround, um ein datetime-Feld für neue Einfügungen auf JETZT () festzulegen:

CREATE TRIGGER `triggername` BEFORE INSERT ON  `tablename` 
FOR EACH ROW 
SET NEW.datetimefield = NOW()

es sollte auch für Updates funktionieren

Antworten von Johan & Leonardo beinhalten das Konvertieren in ein Zeitstempelfeld. Obwohl dies für den in der Frage vorgestellten Anwendungsfall (Speichern von RegisterDate und LastVisitDate) wahrscheinlich in Ordnung ist, ist es keine universelle Lösung. Siehe datetime vs timestamp question.

70
wardk

Meine Lösung

ALTER TABLE `table_name` MODIFY COLUMN `column_name` TIMESTAMP NOT
NULL DEFAULT CURRENT_TIMESTAMP;
43
Leonardo

EUREKA !!!


Für alle, die den Mut verloren haben, einen Standardwert für DATETIME in MySQL festzulegen, weiß ich genau, wie Sie sich fühlen/fühlen. Hier ist es also:

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

Beachten Sie sorgfältig, dass ich keine einfachen Anführungszeichen/Anführungszeichen um das 0 hinzugefügt habe.


Wichtiges Update

Diese Antwort wurde lange zurückgeschickt. Damals funktionierte es bei meiner (wahrscheinlich neuesten) Installation von MySQL und ich hatte Lust, es weiterzugeben. Bitte lesen Sie die folgenden Kommentare, bevor Sie diese Lösung jetzt verwenden.

13
Augiwan

mysql 5.6 docs sagen aus, dass CURRENT_TIMESTAMP als Standard für die Datentypen TIMESTAMP und DATETIME verwendet werden kann:

http://dev.mysql.com/doc/refman/5.6/de/timestamp-initialization.html

4
Jean Rajotte

Bei den Versionen mysql 5.6.5 und neuer können Sie genaue Datumsangaben verwenden und auch Standardwerte festlegen. Es gibt jedoch ein subtiles Bit, das darin besteht, den Genauigkeitswert sowohl an den Aufruf von datetime als auch an den Funktionsaufruf NOW () zu übergeben.

Dieses Beispiel funktioniert:

    ALTER TABLE my_table MODIFY created datetime(6) NOT NULL DEFAULT NOW(6);

Dieses Beispiel funktioniert nicht:

    ALTER TABLE my_table MODIFY created datetime(6) NOT NULL DEFAULT NOW();
2
Matteius

Der beste Weg ist die Verwendung von "DEFAULT 0". Andere Weise:

    /************ ROLE ************/
    drop table if exists `role`;
    create table `role` (
        `id_role` bigint(20) unsigned not null auto_increment,
        `date_created` datetime,
        `date_deleted` datetime,
        `name` varchar(35) not null,
        `description` text,
        primary key (`id_role`)
    ) comment='';

    drop trigger if exists `role_date_created`;
    create trigger `role_date_created` before insert
        on `role`
        for each row 
        set new.`date_created` = now();
`ALTER TABLE  `table_name` CHANGE `column_name` 
    timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 
    ON UPDATE CURRENT_TIMESTAMP

Kann zur Aktualisierung des Zeitstempels beim Update verwendet werden.

1
veelen
ALTER TABLE table_name
  CHANGE COLUMN date_column_name date_column_name DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;

Endlich hat das für mich funktioniert!

0
Eagle_Eye

Mit MySQL funktionierte das für mich:

ALTER TABLE `table_name` MODIFY `column_name` datetime NOT NULL DEFAULT NOW();
0
rosshump