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? Je suis de l'utilisation de MySQL 5.x si c'est un facteur.

774
demandé sur Moppo 2008-10-04 00:24:30

24 réponses

IMPORTANT EDIT: Il est maintenant possible d'y parvenir avec les champs DATETIME depuis MySQL 5.6.5 , jetez un oeil à la autre post ci-dessous...

les versions précédentes ne peuvent pas faire ça 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>

**avertissement: si vous définissez une colonne avec CURRENT_TIMESTAMP ON par défaut, vous devrez toujours spécifiez 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 déclaration de mise à jour 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 cette aide. J'utilise 5.5.56-MariaDB * *

766
répondu sebthebert 2018-04-10 19:15:04

dans la version 5.6.5, il est possible de définir une valeur par défaut sur une colonne datetime, et même 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

499
répondu Gustav Bertram 2012-12-06 14:58:27

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

cela dit, Vous pouvez accomplir ce en créant 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 aidera quelqu'un.

136
répondu Stephan Unrau 2014-02-21 20:34:58

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

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 INSERT statement, comme ceci:

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

ce qui se passe est que le déclencheur écrase immédiatement votre valeur fournie pour le champ, et donc la seule façon de définir un temps non-courant c'est une mise à jour de suivi--Beurk! Pour outrepasser ce comportement lorsqu'une valeur est fournie, essayez cette gâchette légèrement modifiée 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 date et il faudra, 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 nous nous rapprochons!

127
répondu John Larson 2011-04-20 14:12:21

j'ai pu résoudre ce problème en utilisant cet alter statement 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 voudriez que la fonction now() fonctionne. En insérant nulls ou en ignorant les champs created_dt et updated_dt, on obtient une valeur de timestamp parfaite dans les deux champs. Toute mise à jour de la ligne change le fichier updated_dt. Si vous insérez des enregistrements via le navigateur MySQL query vous aviez besoin d'un pas de plus, un déclencheur pour gérer le created_dt avec un nouveau timestamp.

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 la convention de nommage [trig]_[my_table_name]_[insérer]

23
répondu 2 revs, 2 users 74%user188217 2010-01-28 20:53: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
répondu Donald 2011-02-12 21:02:44

pour tous ceux qui ont perdu le cœur en essayant de définir une valeur par défaut DATETIME dans MySQL , je sais exactement comment vous vous sentez/ressenti. Voici donc:

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

observez bien que Je n'ai pas ajouté de guillemets simples / guillemets doubles autour du 0

je saute littéralement après avoir résolu celui-ci: d

13
répondu Augiwan 2016-05-26 11:36:04

c'est en effet une terrible nouvelle. voici une requête de bogue/fonctionnalité en attente depuis longtemps pour ce . cette discussion parle également des limites du type de données timestamp.

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

12
répondu Kinjal Dixit 2009-03-10 18:38:48

MySQL 5.6 A CORRIGÉ ce problème .

ALTER TABLE mytable CHANGE mydate datetime NOT NULL DEFAULT 'CURRENT_TIMESTAMP'
12
répondu Steven Lloyd 2013-04-18 18:44:32

si vous avez déjà créé la table, vous pouvez utiliser

pour changer la valeur par défaut à l'heure actuelle de la date

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

pour changer la valeur par défaut en '2015-05-11 13:01:01'

ALTER TABLE <TABLE_NAME> 
CHANGE COLUMN <COLUMN_NAME> <COLUMN_NAME> DATETIME NOT NULL DEFAULT '2015-05-11 13:01:01';
8
répondu Saveendra Ekanayake 2016-12-07 14:31:20

pour tous ceux qui utilisent la colonne TIMESTAMP comme une solution, je veux seconder la limitation suivante du manuel:

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

"Le type de données TIMESTAMP dispose d'une gamme de '1970-01-01 00:00:01' UTC ' 2038-01-19 03:14:07 ' l'UTC. Ses propriétés varient en fonction de la version MySQL et du mode SQL dans lequel le serveur tourne. Ces propriétés sont décrits plus loin dans cette section. "

donc cela cassera évidemment 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
répondu Fabian 2010-08-06 10:13:48

Vous pouvez utiliser maintenant() pour définir la valeur d'une colonne datetime, mais gardez à l'esprit que vous ne pouvez pas l'utiliser comme valeur par défaut.

6
répondu KernelM 2008-10-03 20:30:13

tout en définissant les déclencheurs multi-lignes, il faut changer le délimiteur car le point-virgule sera pris par le compilateur MySQL comme fin du déclencheur et générera l'erreur. par exemple

DELIMITER //
CREATE TRIGGER `MyTable_UPDATE` BEFORE UPDATE ON `MyTable`
FOR EACH ROW BEGIN
        -- Set the udpate date
    Set new.UpdateDate = now();
END//
DELIMITER ;
6
répondu Drawin Kumar 2011-03-25 08:28:09

J'exécute MySql Server 5.7.11 et cette phrase:

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

est pas de travail. Mais le suivant:

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

fonctionne .

comme un sidenote , il est mentionné dans le mysql docs :

le type DATE est utilisé pour les valeurs avec une partie date mais pas de partie heure. MySQL récupère et affiche les valeurs de DATE dans le format 'AAAA-MM-JJ'. La portée supportée est '1000-01-01' à '9999-12-31'.

même s'ils disent aussi:

les valeurs invalides de DATE, DATETIME ou TIMESTAMP sont converties en valeur "zéro" du type approprié ("0000-00-00" ou '0000-00-00 00:00:00').

6
répondu Evhz 2016-09-18 14:24:36

même si vous ne pouvez pas le faire avec DATETIME dans la définition par défaut, vous pouvez simplement incorporer une instruction select dans votre instruction insert comme ceci:

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

notez l'absence de citations autour de la table.

Pour MySQL 5.5

5
répondu George 2012-01-14 09:02:22

Voici comment le faire sur MySQL 5.1:

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

Je n'ai aucune idée pourquoi vous devez entrer le nom de la colonne deux fois.

4
répondu Samuel 2012-01-14 08:58:49

si vous essayez de définir la valeur par défaut comme NOW(), Je ne pense pas que MySQL supporte cela. Dans MySQL, vous ne pouvez pas utiliser une fonction ou une expression comme valeur par défaut pour n'importe quel type de colonne, sauf pour la colonne de type de données TIMESTAMP, pour laquelle vous pouvez spécifier CURRENT_TIMESTAMP comme valeur par défaut.

3
répondu Vijesh VP 2008-10-03 20:31:25
CREATE TABLE `testtable` (
    `id` INT(10) NULL DEFAULT NULL,
    `colname` DATETIME NULL DEFAULT '1999-12-12 12:12:12'
)

dans la requête ci-dessus pour créer 'testable', j'ai utilisé '1999-12-12 12: 12: 12' comme valeur par défaut pour la colonne DATETIME colname

2
répondu Fathah Rehman P 2012-12-12 12:39:46

utiliser le code suivant

DELIMITER $$

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

    DELIMITER ;
2
répondu Rana Aalamgeer 2016-09-19 10:46:32

si vous essayez de définir la valeur par défaut comme NOW(),MySQL supporte que vous devez changer le type de cette colonne TIMESTAMP au lieu de DATETIME. TIMESTAMP ont la date courante et l'heure par défaut..je pense que cela a résolu votre problème..

0
répondu Dhrumil Shah 2012-11-16 06:10:46

prendre par exemple si j'avais une table nommée 'site' avec un created_at et une colonne update_at qui étaient à la fois DATETIME et ont besoin de la valeur par défaut de now, je pourrais exécuter le sql suivant pour réaliser ceci.

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;

la séquence des instructions est importante parce qu'une table ne peut pas avoir deux colonnes de type TIMESTAMP avec des valeurs par défaut de curent TIMESTAMP

0
répondu Joseph Persie 2013-10-09 00:13:13

C'est mon exemple de déclenchement:

/************ 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();
0
répondu Lucas Moyano Angelini 2015-02-19 13:29:11

je pense que c'est simple dans mysql depuis mysql la fonction intégrée appelée now() qui donne l'heure courante(l'Heure de cette insertion).

donc votre requête devrait ressembler à similaire

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

Merci.

0
répondu Deepak N 2018-07-26 08:07:18

vous pouvez résoudre le timestamp par défaut. Tout d'abord, considérez quel jeu de caractères vous utilisez par exemple si u a pris utf8 ce jeu de caractères prend en charge toutes les langues et si u a pris laten1 ce jeu de caractères ne prend en charge que l'anglais. Suivant setp si vous travaillez dans le cadre d'un projet, vous devez connaître le fuseau horaire du client et choisir que vous êtes le fuseau horaire du client. Cette étape est obligatoire.

-2
répondu Srinivas 2011-04-28 12:05:50