it-swarm.com.de

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

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

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

831
Brian Boatright

WICHTIGE ÄNDERUNG: Dies ist jetzt mit DATETIME-Feldern möglich, da MySQL 5.6.5 , schau mal in den anderen Beitrag unten ...

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

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 heißt, wenn Sie nicht möchten, dass sich der Wert ändert, muss Ihre UPDATE-Anweisung "[Ihr Spaltenname] = [Ihr Spaltenname]" (oder einen anderen Wert) enthalten. Andernfalls wird der Wert zu "now ()". Seltsam, aber wahr. Ich hoffe das hilft. Ich benutze 5.5.56-MariaDB **

812
sebthebert

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

553
Gustav Bertram

MySQL ( vor Version 5.6.5 ) erlaubt nicht die Verwendung von Funktionen für Standard-DateTime-Werte. TIMESTAMP ist aufgrund seines ungewöhnlichen Verhaltens nicht geeignet und wird nicht zur Verwendung als Eingabedaten empfohlen. (Siehe MySQL Data Type Defaults .)

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 "Before Insert" und "SET NEW.DateCreated=NOW()" erstellt und er funktioniert hervorragend.

Ich hoffe das hilft jemandem.

141
Stephan Unrau

Für mich hat der Trigger-Ansatz am besten funktioniert, aber ich fand einen Haken bei dem Ansatz. Betrachten Sie den grundlegenden Auslöser, um ein Datumsfeld auf die aktuelle Uhrzeit beim Einfügen zu setzen:

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

Dies ist normalerweise großartig, aber sagen wir, Sie möchten das Feld manuell über die INSERT-Anweisung setzen, wie folgt:

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

Was passiert, ist, dass der Trigger den von Ihnen angegebenen Wert für das Feld sofort überschreibt. Die einzige Möglichkeit, eine nicht aktuelle Zeit festzulegen, ist eine UPDATE-Folgeanweisung - igitt! Versuchen Sie diesen leicht geänderten Trigger mit dem IFNULL-Operator, um dieses Verhalten zu überschreiben, wenn ein Wert angegeben wird:

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

Dies bietet das Beste aus beiden Welten: Sie können einen Wert für Ihre Datumsspalte angeben, der benötigt wird. Andernfalls wird standardmäßig die aktuelle Uhrzeit verwendet. Es ist immer noch ein Ghetto im Vergleich zu etwas Sauberem wie DEFAULT GETDATE () in der Tabellendefinition, aber wir kommen näher!

129
John Larson

Ich konnte dies mit dieser alter-Anweisung in meiner Tabelle lösen, die zwei datetime-Felder enthielt.

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 now () - Funktion erwarten würden. Das Einfügen von Nullen oder das Ignorieren der Felder created_dt und updated_dt führt in beiden Feldern zu einem perfekten Zeitstempelwert. Bei jeder Aktualisierung der Zeile wird die Datei updated_dt geändert. Wenn Sie Datensätze über den MySQL-Abfrage-Browser einfügen, benötigen Sie einen weiteren Schritt, einen Trigger, um die erstellte_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] _ [mein_Tabellenname] _ [Einfügen]

26
user188217

Sie können Trigger verwenden, um solche Dinge zu tun.

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
Donald

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

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

Beachten Sie bitte Folgendes: Ich habe keine einfachen/doppelten Anführungszeichen hinzugefügt um

Ich springe buchstäblich, nachdem ich dieses gelöst habe: D

16
Augiwan

MySQL 5.6 hat dieses Problem behoben .

ALTER TABLE mytable CHANGE mydate datetime NOT NULL DEFAULT 'CURRENT_TIMESTAMP'
13
Steven Lloyd

dies ist in der Tat eine schreckliche Nachricht. Hier ist eine lange ausstehende Anfrage nach einem Bug/Feature für dieses . In dieser Diskussion geht es auch um die Einschränkungen des Zeitstempeldatentyps.

Ich frage mich ernsthaft, was das Problem bei der Implementierung dieser Sache ist.

12
Kinjal Dixit

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

m den Standardwert auf das aktuelle Datum und die Uhrzeit umzustellen

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

m den Standardwert auf "2015-05-11 13:01:01" zu ändern

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

Ich verwende MySQL Server 5.7.11 und diesen Satz:

ALTER TABLE table_name CHANGE date_column datetime NOT NULL DEFAULT '0000-00-00 00:00:00'

funktioniert nicht . Aber das Folgende:

ALTER TABLE table_name CHANGE date_column datetime NOT NULL DEFAULT '1000-01-01 00:00:00'

funktioniert einfach .

Als Randnotiz wird es in den mysql docs erwähnt:

Der Typ DATE wird für Werte mit einem Datumsteil, aber ohne Zeitteil verwendet. MySQL ruft DATE-Werte im Format 'JJJJ-MM-TT' ab und zeigt sie an. Der unterstützte Bereich reicht von '1000-01-01' bis '9999-12-31'.

selbst wenn sie auch sagen:

Ungültige DATE-, DATETIME- oder TIMESTAMP-Werte werden in den "Null" -Wert des entsprechenden Typs konvertiert ("0000-00-00" oder "0000-00-00 00:00:00").

8
Evhz

Beim Definieren von mehrzeiligen Triggern muss der Begrenzer geändert werden, da das Semikolon vom MySQL-Compiler als Ende des Triggers verwendet wird und Fehler erzeugt. z.B.

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

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

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

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

Das wird Ihre Software in etwa 28 Jahren offensichtlich kaputt machen.

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

7
Fabian

Sie können now () verwenden, um den Wert einer datetime-Spalte festzulegen. Beachten Sie jedoch, dass Sie diesen Wert nicht als Standardwert verwenden können.

6
KernelM

Während Sie dies mit DATETIME in der Standarddefinition nicht tun können, können Sie einfach eine select-Anweisung in Ihre insert-Anweisung wie folgt einfügen:

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

Beachten Sie das Fehlen von Anführungszeichen um die Tabelle.

Für MySQL 5.5

5
George

So geht's unter MySQL 5.1:

ALTER TABLE `table_name` CHANGE `column_name` `column_name` 
TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;

Ich habe keine Ahnung, warum Sie den Spaltennamen zweimal eingeben müssen.

4
Samuel

Wenn Sie versuchen, den Standardwert auf NOW () zu setzen, unterstützt MySQL dies meiner Meinung nach nicht. In MySQL können Sie für keinen Spaltentyp eine Funktion oder einen Ausdruck als Standardwert verwenden, außer für die Datentypspalte TIMESTAMP, für die Sie CURRENT_TIMESTAMP als Standardwert angeben können.

3
Vijesh VP

Verwenden Sie den folgenden Code

DELIMITER $$

    CREATE TRIGGER bu_table1_each BEFORE UPDATE ON table1 FOR EACH ROW
    BEGIN
      SET new.datefield = NOW();
    END $$

    DELIMITER ;
2
Rana Aalamgeer
CREATE TABLE `testtable` (
    `id` INT(10) NULL DEFAULT NULL,
    `colname` DATETIME NULL DEFAULT '1999-12-12 12:12:12'
)

In der obigen Abfrage zum Erstellen von 'testtable' habe ich '1999-12-12 12:12:12' als Standardwert für die DATETIME-Spalte colname verwendet.

2
Fathah Rehman P

Ich denke, es ist in Mysql einfach, da Mysql die eingebaute Funktion now () aufruft, die die aktuelle Zeit (Zeit dieser Einfügung) angibt.

Ihre Anfrage sollte also ähnlich aussehen

CREATE TABLE defaultforTime(
    `creation_time`     DATETIME DEFAULT CURRENT_TIMESTAMP,
    `modification_time` DATETIME default now()
);

Danke.

1
Deepak N

Wenn Sie versuchen, den Standardwert auf NOW () zu setzen, unterstützt MySQL, dass Sie den Typ dieser Spalte TIMESTAMP anstelle von DATETIME ändern müssen. TIMESTAMP haben aktuelles Datum und Uhrzeit als Standard. Ich denke, es wird Ihr Problem gelöst.

0
Dhrumil Shah

Nehmen wir zum Beispiel an, ich hätte eine Tabelle namens 'site' mit einer created_at- und einer update_at-Spalte, die beide DATETIME-Werte haben und den Standardwert von now benötigen. Dazu könnte ich den folgenden SQL-Code ausführen.

 ALTER TABLE `site` CHANGE` created_at` `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP; 
 
 ALTER TABLE` site` CHANGE `created_at`` created_at` DATETIME NULL DEFAULT NULL; 
 
 ALTER TABLE `site` CHANGE` updated_at` `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP; 
 
 ALTER TABLE` site` CHANGE `updated_at`` updated_at` DATETIME NULL DEFAULT NULL; 

Die Reihenfolge der Anweisungen ist wichtig, da eine Tabelle nicht zwei Spalten vom Typ TIMESTAMP mit den Standardwerten von CUREENT TIMESTAMP enthalten kann

0
Joseph Persie

Dies ist mein Trigger-Beispiel:

/************ 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();