919 votes

Comment pouvez-vous définir une valeur par défaut pour une colonne Datetime de MySQL?

Comment pouvez-vous définir une valeur par défaut pour une colonne Datetime de MySQL?

Dans SQL Server, il est getdate(). Quel est l'équivalent pour MySQL? Je suis de l'utilisation de MySQL 5.x si c'est un facteur.

885voto

sebthebert Points 4038

IMPORTANT EDIT: Il est maintenant possible de réaliser cela avec les champs DATETIME depuis MySQL 5.6.5, jetez un oeil à l' autre post ci-dessous...

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

Mais vous pouvez le faire avec HORODATAGE:

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>

615voto

Gustav Bertram Points 4555

Dans la version 5.6.5, il est possible de définir une valeur par défaut pour une colonne datetime, et même en faire une colonne qui sera mise à jour lorsque la ligne est mise à jour. La définition du 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

150voto

Stephan Unrau Points 989

MySQL (avant la version 5.6.5) ne permet pas d'utiliser les fonctions par défaut des valeurs DateTime. HORODATAGE n'est pas approprié en raison de son comportement étrange et n'est pas recommandé pour une utilisation en tant que données d'entrée. (Voir MySQL Type De Données Par Défaut.)

Cela dit, vous pouvez accomplir ceci par la création d'un Déclencheur.

J'ai une table avec un champ DateCreated de type DateTime. J'ai créé un trigger sur la table "Avant d'ajouter" et "SET NEW.DateCreated=NOW()" et il fonctionne très bien.

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

135voto

John Larson Points 799

Pour moi le déclencheur approche a travaillé le meilleur, mais j'ai trouvé un problème avec l'approche. Considérons la base de déclenchement pour définir un champ de date à l'heure actuelle sur insérer:

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

C'est généralement grand, mais dire que vous souhaitez définir manuellement le champ via une instruction INSERT, comme suit:

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

Ce qui se passe est que le déclencheur immédiatement remplace votre valeur pour le champ, et donc la seule façon de définir un non-le temps actuel est un suivi de la mise à JOUR de déclaration, beurk! Pour remplacer ce comportement lorsqu'une valeur est fournie, essayez cette légèrement modifiée de déclenchement avec le IFNULL de l'opérateur:

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 date et il va prendre, et sinon ça va défaut à l'heure actuelle. C'est toujours ghetto par rapport à quelque chose de propre que par DÉFAUT GETDATE() dans la définition de la table, mais nous nous rapprochons!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X