web-dev-qa-db-fra.com

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

J'ai deux colonnes dans la table utilisateurs à savoir registerDate and lastVisitDate qui consistent en type de données datetime. Je voudrais faire ce qui suit.

  1. Définit la valeur par défaut de registerDate sur MySQL NOW ()
  2. Définissez la valeur par défaut lastVisitDate sur 0000-00-00 00:00:00 au lieu de null utilisé par défaut.

Parce que la table existe déjà et a des enregistrements existants, je voudrais utiliser Modify table. J'ai essayé d'utiliser le code ci-dessous, mais cela ne fonctionne pas. 

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

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

Est-il possible pour moi de définir la valeur de date/heure par défaut sur NOW () dans MySQL?

177

Depuis MySQL 5.6.5, vous pouvez utiliser le type DATETIME avec une valeur dynamique par défaut:

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 le type de données TIMESTAMP, qui est mis à jour automatiquement chaque fois que l'enregistrement est modifié. Malheureusement, un seul champ TIMESTAMP mis à jour automatiquement peut exister par table.

CREATE TABLE mytable (
  mydate TIMESTAMP
)

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

Si vous souhaitez empêcher MySQL de mettre à jour la valeur timestamp sur UPDATE (pour ne déclencher que sur INSERT), vous pouvez modifier la définition en:

CREATE TABLE mytable (
  mydate TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
221
Johan

J'utilise un déclencheur comme solution de contournement pour définir un champ de date/heure sur NOW () pour les nouvelles insertions:

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

ça devrait marcher aussi pour les mises à jour

Les réponses de Johan & 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), il ne s'agit pas d'une solution universelle. Voir datetime vs timestamp question.

70
wardk

Ma solution

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

EUREKA !!!


Pour tous ceux qui ont perdu courage en essayant de définir une valeur default DATETIME dans MySQL, je sais exactement ce que vous ressentez. Alors la 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 autour de 0.


Mise à jour importante

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

13
Augiwan

les documents mysql 5.6 indiquent que CURRENT_TIMESTAMP peut être utilisé par défaut pour les types de données TIMESTAMP et DATETIME:

http://dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html

4
Jean Rajotte

Sur les versions mysql 5.6.5 et plus récentes, vous pouvez utiliser des dates/heures précises et définir des valeurs par défaut. Il y a cependant un bit subtil qui consiste à transmettre la valeur de précision à l'appel de la fonction datetime et NOW ().

Cet exemple fonctionne:

    ALTER TABLE my_table MODIFY created datetime(6) NOT NULL DEFAULT NOW(6);

Cet exemple ne fonctionne pas:

    ALTER TABLE my_table MODIFY created datetime(6) NOT NULL DEFAULT NOW();
2
Matteius

Le meilleur moyen consiste à utiliser "DEFAULT 0" . Autre moyen: /************ ROLE ************/ drop table s'il existe role; create table role ( id_role bigint (20) unsigned not null autoincrément, date_created datetime, date_deleted datetime, name varchar (35) non null, description texte, clé (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();
1
Lucas Moyano Angelini
`ALTER TABLE  `table_name` CHANGE `column_name` 
    timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 
    ON UPDATE CURRENT_TIMESTAMP

Peut être utilisé pour mettre à jour l'horodatage lors de la mise à jour.

1
veelen
ALTER TABLE table_name
  CHANGE COLUMN date_column_name date_column_name DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;

Enfin, cela a fonctionné pour moi!

0
Eagle_Eye

Cela a fonctionné pour moi, en utilisant MySQL:

ALTER TABLE `table_name` MODIFY `column_name` datetime NOT NULL DEFAULT NOW();
0
rosshump