205 votes

Définir NOW() comme valeur par défaut pour le type de données datetime ?

J'ai deux colonnes dans la table users à savoir registerDate and lastVisitDate qui se compose du type de données datetime. Je voudrais faire ce qui suit.

  1. Définir la valeur par défaut de registerDate à MySQL NOW()
  2. Définir la valeur par défaut de lastVisitDate à 0000-00-00 00:00:00 Au lieu de null qu'il utilise par défaut.

Comme la table existe déjà et qu'il y a des enregistrements existants, je voudrais utiliser Modify table. J'ai essayé d'utiliser les deux morceaux de code ci-dessous, mais aucun ne fonctionne.

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

Cela me donne l'erreur : ERROR 1067 (42000): Invalid default value for 'registerDate'

Est-il possible pour moi de définir la valeur par défaut du temps de date à NOW() dans MySQL ?

4 votes

ALTER TABLE users MODIFY dateTime timestamp default CURRENT_TIMESTAMP . Vous n'avez pas défini le data type de terrain dans vos deux efforts

5 votes

Depuis MySQL 5.6 DATE devrait fonctionner avec la valeur par défaut NOW()

1 votes

Selon cette documentation mysql 5.6 : dev.mysql.com/doc/refman/5.6/fr/data-type-defaults.html vous pouvez utiliser CURRENT_TIMESTAMP() par défaut.

258voto

Johan Points 34755

À partir de MySQL 5.6.5, vous pouvez utiliser la fonction DATETIME avec une valeur par défaut dynamique :

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

Ou même combiner les deux règles :

modification_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

Référence :
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

Avant la version 5.6.5, vous devez utiliser l'option TIMESTAMP qui se met automatiquement à jour lorsque l'enregistrement est modifié. Malheureusement, il n'existe qu'un seul type de données auto-actualisées. TIMESTAMP peut exister par table.

CREATE TABLE mytable (
  mydate TIMESTAMP
)

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

Si vous voulez empêcher MySQL de mettre à jour la valeur de l'horodatage sur UPDATE (pour qu'il ne se déclenche que sur INSERT ) vous pouvez changer la définition en :

CREATE TABLE mytable (
  mydate TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)

81 votes

Je ne veux vraiment pas utiliser le timestamp.

0 votes

@ibrahim, pourquoi pas ?, vous déclarez ALTER TABLE users MODIFY registerDate datetime DEFAULT CURRENT_TIMESTAMP; comme un exemple explicite dans la question.

2 votes

@Ibrahim : le timestamp est votre seule chance. Si vous utilisez un champ date, vous devez insérer un enregistrement en utilisant now() à chaque fois.

71voto

wardk Points 386

J'utilise un déclencheur comme solution de rechange pour définir un champ de date à NOW() pour les nouvelles insertions :

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

cela devrait aussi fonctionner pour les mises à jour

Les réponses de Johan et Leonardo impliquent la conversion en un champ d'horodatage. Bien que cela soit probablement correct pour le cas d'utilisation présenté dans la question (stockage de RegisterDate et LastVisitDate), ce n'est pas une solution universelle. Voir datetime vs timestamp question.

4 votes

Cela devrait être la réponse acceptée, mais vous devriez spécifiquement la modifier pour qu'il soit évident qu'il s'agit d'un champ de date. L'auteur de la question veut savoir comment résoudre le problème pour un champ de type date et heure. use a timestamp est une solution de contournement stupide si vous apprenez vraiment la différence entre ces deux types de données.

47voto

Leonardo Points 461

Ma solution

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

0 votes

Cette défense fonctionne, je recommande à tout le monde d'utiliser SQLYog ou un outil comme ça, il vous permet de faire ce genre de choses sur une interface facile.

29 votes

C'est toujours la solution pour TIMESTAMP colonne. Personne ne demandait TIMESTAMP ...

2 votes

Oui, ce n'est pas la réponse à la question. TIMESTAMP est un type de champ différent de DATETIME.

14voto

UGS Points 830

EUREKA ! !!


Pour tous ceux qui ont perdu le cœur en essayant d'établir un valeur DATETIME par défaut dans MySQL je sais exactement ce que tu ressens. Alors voilà :

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

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


Mise à jour importante :

Cette réponse a été postée il y a longtemps. À l'époque, elle fonctionnait sur mon installation (probablement la plus récente) de MySQL et j'ai eu envie de la partager. Veuillez lire les commentaires ci-dessous avant de décider d'utiliser cette solution maintenant.

16 votes

Cela dépend des attentes... - Cette solution vous permet d'avoir le champ NOT NULL, puisqu'un défaut est fourni. - Cette solution ne mettra pas le champ à NOW().

10 votes

Cela ne répond pas à la question initiale ; la réponse devrait l'indiquer clairement.

2 votes

Sachez que le mode SQL TRADITIONNEL inclut NO_ZERO_DATE, donc ce qui précède ne fonctionnera pas dans ce cas.

-1voto

George Points 29

Je ne suis pas sûr que ce sujet soit toujours d'actualité, mais voilà.

En ce qui concerne la définition des valeurs par défaut de Now(), je ne pense pas que cela soit possible pour le type de données DATETIME. Si vous voulez utiliser ce type de données, définissez la date lorsque vous effectuez l'insertion comme ceci :

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

Ma version de mySQL est 5.5

7 votes

Peut être simplifié comme suit : INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', NOW())

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