NOW () als Standardwert für datetime datatype festlegen?

197

Ich habe zwei Spalten in Tabellenbenutzern, registerDate and lastVisitDatedie aus dem Datetime-Datentyp bestehen. Ich möchte Folgendes tun.

  1. Setzen Sie den Standardwert für registerDate auf MySQL NOW ()
  2. Setzen Sie den Standardwert für lastVisitDate auf 0000-00-00 00:00:00Anstelle von null, das standardmäßig verwendet wird.

Da die Tabelle bereits vorhanden ist und vorhandene Datensätze enthält, möchte ich die Tabelle ändern verwenden. Ich habe versucht, die beiden folgenden Codes zu verwenden, aber keiner funktioniert.

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

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

Kann ich in MySQL den Standardwert für Datum und Uhrzeit auf NOW () setzen?

Ibrahim Azhar Armar
quelle
4
ALTER TABLE users MODIFY dateTime timestamp default CURRENT_TIMESTAMP. Sie haben das data typeFeld in beiden Ihrer Bemühungen nicht definiert
Shakti Singh
3
Da MySQL 5.6 DATEmit Standardwert funktionieren sollteNOW()
AbcAeffchen
Gemäß dieser mysql 5.6-Dokumentation: dev.mysql.com/doc/refman/5.6/en/data-type-defaults.html können Sie standardmäßig CURRENT_TIMESTAMP () verwenden.
blacktie24
Wie würde ich CURRENT_TIMESTAMP + 1 DAY
Ilker Baltaci

Antworten:

241

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

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

Oder kombinieren Sie 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 TIMESTAMPDatentyp verwenden, der automatisch aktualisiert wird, wenn der Datensatz geändert wird. Leider TIMESTAMPkann pro Tabelle nur ein automatisch aktualisiertes Feld vorhanden sein.

CREATE TABLE mytable (
  mydate TIMESTAMP
)

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

Wenn Sie verhindern möchten, dass MySQL den Zeitstempelwert auf aktualisiert UPDATE(sodass er nur aktiviert wird INSERT), können Sie die Definition wie folgt ändern:

CREATE TABLE mytable (
  mydate TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
Johan
quelle
80
Ich möchte wirklich keinen Zeitstempel verwenden.
Ibrahim Azhar Armar
2
@Ibrahim: Zeitstempel ist deine einzige Chance. Wenn Sie ein Datum / Uhrzeit-Feld verwenden, müssen Sie jedes Mal mit now () einen Datensatz einfügen.
Nicola Cossu
9
Das Handbuch spricht klar: "Dies bedeutet beispielsweise, dass Sie den Standardwert für eine Datumsspalte nicht auf den Wert einer Funktion wie NOW () oder CURRENT_DATE festlegen können."
Nicola Cossu
19
@Johan DATETIMEwird oft bevorzugt, um den Bereich zu machen, den es halten kann: '1000-01-01 00:00:00' bis '9999-12-31 23:59:59' im Vergleich zu TIMESTAMPS's' 1970-01-01 00: 00:01 'UTC bis' 2038-01-19 03:14:07 'UTC. Zum Beispiel zum Speichern von Geburtsdaten oder etwas mehr als 30 Jahren in der Zukunft.
user17753
5
@nickrulez Sie sind nicht mehr auf timestampdieses Verhalten ab MySQL 5.6
Dan Esparza
70

Ich verwende einen Trigger als Problemumgehung, um ein Datum / Uhrzeit-Feld für neue Einfügungen auf NOW () zu setzen:

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

Es sollte auch für Updates funktionieren

Die Antworten von Johan & Leonardo beinhalten die Konvertierung in ein Zeitstempelfeld. Obwohl dies für den in der Frage dargestellten Anwendungsfall (Speichern von RegisterDate und LastVisitDate) wahrscheinlich in Ordnung ist, handelt es sich nicht um eine universelle Lösung. Siehe Frage zu Datum / Uhrzeit und Zeitstempel .

Wardk
quelle
4
Dies sollte die akzeptierte Antwort sein, aber speziell sollten Sie sie bearbeiten, um zu verdeutlichen, dass es sich um ein Datum / Uhrzeit-Feld handelt. Das Originalposter möchte wissen, wie es für ein Datum / Uhrzeit-Feld gelöst werden kann, und use a timestampist eine dumme Problemumgehung, wenn Sie den Unterschied zwischen diesen beiden Datentypen wirklich kennen.
Phpguru
45

Meine Lösung

ALTER TABLE `table_name` MODIFY COLUMN `column_name` TIMESTAMP NOT
NULL DEFAULT CURRENT_TIMESTAMP;
Leonardo
quelle
Dies funktioniert auf jeden Fall. Ich empfehle jedem, SQLYog oder ein solches Tool zu verwenden. Damit können Sie diese Aufgaben auf einer einfachen Oberfläche ausführen.
Unveränderlicher Ziegelstein
27
Dies ist immer noch eine Lösung für die TIMESTAMPSäule. Niemand fragte nach TIMESTAMP...
Petr Peller
2
Ja, das ist nicht die Antwort auf die Frage. TIMESTAMP ist ein anderer Feldtyp als DATETIME.
John Hunt
@ Leonardo, wie kann ich nur Datum anzeigen
151291
13

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. 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 / doppelten Anführungszeichen um die 0 hinzugefügt habe .


Wichtiges Update :

Diese Antwort wurde vor langer Zeit veröffentlicht. Damals funktionierte es bei meiner (wahrscheinlich neuesten) Installation von MySQL und ich wollte es teilen. Bitte lesen Sie die folgenden Kommentare, bevor Sie sich für diese Lösung entscheiden.

Augiwan
quelle
16
Dies hängt von den Erwartungen ab ... - Mit dieser Lösung können Sie das Feld NOT NULL festlegen, da ein Standardwert angegeben ist. - Diese Lösung setzt das Feld nicht auf NOW ().
CodeReaper
10
Dies beantwortet nicht die ursprüngliche Frage; Die Antwort sollte dies klar angeben.
Matt Browne
2
Beachten Sie, dass der TRADITIONELLE SQL-Modus NO_ZERO_DATE enthält, sodass das oben Genannte in diesem Fall nicht funktioniert.
Móż
Basierend auf den Antworten klingt es so, als müssten Sie Trigger verwenden, wenn Sie DATETIME nicht als TIMESTAMP opfern.
Chris
1
Diese Lösung wird einige Apis verrückt machen mit "OMG es ist ein NULL-Datum! Was für eine Häresie! Wir können 'dies' nicht in ein java.lang.Date/System.DateTime! OMG! -Crashes-" konvertieren.
Felype
4

In den Versionen MySQL 5.6.5 und höher können Sie genaue Datumsangaben verwenden und auch Standardwerte festlegen. Es gibt jedoch ein subtiles Bit, das darin besteht, den Genauigkeitswert sowohl an den Dataufruf 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();
Matteius
quelle
1
`ALTER TABLE  `table_name` CHANGE `column_name` 
    timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 
    ON UPDATE CURRENT_TIMESTAMP

Kann verwendet werden, um den Zeitstempel beim Update zu aktualisieren.

veelen
quelle
1

Am besten verwenden Sie "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();
Lucas Moyano Angelini
quelle
0

Dies funktionierte bei mir mit MySQL:

ALTER TABLE `table_name` MODIFY `column_name` datetime NOT NULL DEFAULT NOW();
Rosshump
quelle
0
ALTER TABLE table_name
  CHANGE COLUMN date_column_name date_column_name DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;

Endlich hat das bei mir funktioniert!

Eagle_Eye
quelle
0
CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `dateCreated` datetime DEFAULT CURRENT_TIMESTAMP,
  `dateUpdated` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `mobile_UNIQUE` (`mobile`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
Gvs Akhil
quelle
-1

Ich bin mir nicht sicher, ob dies noch aktiv ist, aber hier geht es weiter.

In Bezug auf das Setzen der Standardeinstellungen auf Now () sehe ich dies für den Datentyp DATETIME nicht als möglich an. Wenn Sie diesen Datentyp verwenden möchten, legen Sie das Datum für die Einfügung wie folgt fest:

INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))

Meine Version von mySQL ist 5.5

George
quelle
7
Kann vereinfacht werden als:INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', NOW())
user17753
-1

Das hat bei mir funktioniert - ich habe gerade INSERT für meine Tabelle in UPDATE geändert.

INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))
Unterschiedliche Generation
quelle