Question Comment définir une valeur par défaut pour une colonne MySQL Datetime?


Comment définir une valeur par défaut pour une colonne MySQL Datetime?

Dans SQL Server, c'est getdate(). Quel est l'équivalent pour MySQL? J'utilise MySQL 5.x si c'est un facteur.


761
2017-10-03 20:24


origine


Réponses:


EDIT IMPORTANT: Il est maintenant possible de réaliser ceci avec les champs DATETIME depuis MySQL 5.6.5, jetez un oeil à la autre poste au dessous de...

Les versions précédentes ne peuvent pas faire cela avec DATETIME ...

Mais vous pouvez le faire avec TIMESTAMP:

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: SI vous définissez une colonne avec CURRENT_TIMESTAMP ON par défaut, vous devrez TOUJOURS spécifier une valeur pour cette colonne ou la valeur se réinitialisera automatiquement à "now ()" lors de la mise à jour. Cela signifie que si vous ne voulez pas que la valeur change, votre instruction UPDATE doit contenir "[votre nom de colonne] = [votre nom de colonne]" (ou une autre valeur) ou la valeur deviendra "now ()". Bizarre, mais vrai. J'espère que ça aide. J'utilise 5.5.56-MariaDB **


750
2017-10-03 20:48



Dans la version 5.6.5, il est possible de définir une valeur par défaut sur une colonne datetime, et même de créer une colonne qui sera mise à jour lors de la mise à jour de la ligne. La définition de type:

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

Référence: http://optimize-this.blogspot.com/2012/04/datetime-default-now-finally-available.html


492
2018-05-15 14:44



MySQL (avant la version 5.6.5) n'autorise pas l'utilisation de fonctions pour les valeurs DateTime par défaut. TIMESTAMP ne convient pas en raison de son comportement étrange et n'est pas recommandé pour une utilisation en tant que données d'entrée. (Voir Type de données MySQL par défaut.)

Cela dit, vous pouvez accomplir cela en créant un déclencheur.

J'ai une table avec un champ DateCreated de type DateTime. J'ai créé un déclencheur sur cette table "Avant insertion" et "SET NEW.DateCreated=NOW()"et ça marche très bien.

J'espère que cela aide quelqu'un.


135
2017-09-27 17:04



Pour moi, l'approche de déclenchement a fonctionné le mieux, mais j'ai trouvé un problème avec l'approche. Considérez le déclencheur de base pour définir un champ de date à l'heure actuelle sur l'insertion:

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

C'est généralement génial, mais dites que vous voulez définir le champ manuellement via l'instruction INSERT, comme ceci:

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

Qu'est-ce qui se passe, c'est que le déclencheur écrase immédiatement votre valeur fournie pour le champ, et donc la seule façon de définir une heure non-temps est une instruction UPDATE de suivi - beurk! Pour remplacer ce comportement lorsqu'une valeur est fournie, essayez ce déclencheur légèrement modifié avec l'opérateur IFNULL:

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

Cela donne le meilleur des deux mondes: vous pouvez fournir une valeur pour votre colonne de date et cela prendra, et sinon, il sera par défaut à l'heure actuelle. C'est toujours ghetto par rapport à quelque chose de propre comme DEFAULT GETDATE () dans la définition de la table, mais on s'en rapproche!


127
2018-04-20 14:12



J'ai été capable de résoudre cela en utilisant cette déclaration alter sur ma table qui avait deux champs datetime.

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;

Cela fonctionne comme vous vous attendez à ce que la fonction now () fonctionne. L'insertion de valeurs NULL ou l'ignorance des champs created_dt et updated_dt donne une valeur d'horodatage parfaite dans les deux champs. Toute mise à jour de la ligne modifie le fichier updated_dt. Si vous insérez des enregistrements via le navigateur de requêtes MySQL, vous avez besoin d'un pas de plus, un déclencheur pour gérer le created_dt avec un nouvel horodatage.

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

Le déclencheur peut être ce que vous voulez. J'aime juste la convention de nommage [trig] _ [my_table_name] _ [insert]


22
2018-02-12 17:44



Vous pouvez utiliser des déclencheurs pour faire ce genre de choses.

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



Pour tous ceux qui ont perdu le cœur en essayant de définir un défaut DATETIME valeur en MySQL, Je sais exactement ce que tu ressens / ressens. Alors voici:

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

Observez attentivement que Je n'ai pas ajouté de guillemets simples / doubles guillemets autour de la 0

Je saute littéralement après avoir résolu celui-ci: D


13
2018-03-10 18:38



c'est en effet une terrible nouvelle.voici une longue demande de bug / fonctionnalité en attente pour cela. cette discussion parle également des limitations du type de données d'horodatage.

Je me demande sérieusement quel est le problème avec la mise en œuvre de cette chose.


12
2018-02-21 21:28



MySQL 5.6 a résolu ce problème.

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

12
2017-08-06 10:13



Pour tous ceux qui utilisent la colonne TIMESTAMP en tant que solution, je souhaite supprimer la limitation suivante du manuel:

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

"Le type de données TIMESTAMP a une plage de '1970-01-01 00:00:01' UTC à '2038-01-19 03:14:07' UTC. Il a des propriétés variables, selon la version de MySQL et le mode SQL dans lequel le serveur s'exécute. Ces propriétés sont décrites plus loin dans cette section. "

Donc, cela va évidemment casser votre logiciel dans environ 28 ans.

Je crois que la seule solution du côté de la base de données est d'utiliser des déclencheurs comme mentionné dans d'autres réponses.


7
2017-12-07 14:31