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

197

J'ai deux colonnes dans les utilisateurs de table, à savoir registerDate and lastVisitDatequi se composent du type de données datetime. Je voudrais faire ce qui suit.

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

Parce que la table existe déjà et a des enregistrements existants, je voudrais utiliser la table Modifier. 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 une erreur: ERROR 1067 (42000): Invalid default value for 'registerDate'

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

Ibrahim Azhar Armar
la source
4
ALTER TABLE users MODIFY dateTime timestamp default CURRENT_TIMESTAMP. Vous n'avez pas défini le data typechamp dans vos deux efforts
Shakti Singh
3
Puisque MySQL 5.6 DATEdevrait fonctionner avec la valeur par défautNOW()
AbcAeffchen
Selon cette documentation mysql 5.6: dev.mysql.com/doc/refman/5.6/en/data-type-defaults.html , vous pouvez utiliser CURRENT_TIMESTAMP () par défaut.
blacktie24
comment pourrais-je implémenter CURRENT_TIMESTAMP + 1 JOUR
Ilker Baltaci

Réponses:

241

Depuis MySQL 5.6.5, vous pouvez utiliser le DATETIMEtype 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 TIMESTAMPtype de données, qui se met à jour automatiquement chaque fois que l'enregistrement est modifié. Malheureusement, cependant, un seul TIMESTAMPchamp mis à jour automatiquement peut exister par table.

CREATE TABLE mytable (
  mydate TIMESTAMP
)

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

Si vous souhaitez empêcher MySQL de mettre à jour la valeur d'horodatage UPDATE(de sorte qu'elle ne se déclenche que INSERT), vous pouvez modifier la définition en:

CREATE TABLE mytable (
  mydate TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
Johan
la source
80
Je ne veux vraiment pas utiliser d'horodatage.
Ibrahim Azhar Armar
2
@ Ibrahim: l'horodatage est votre seule chance. Si vous utilisez un champ datetime, vous devez insérer l'enregistrement à l'aide de now () à chaque fois.
Nicola Cossu
9
Le manuel est clair: "Cela signifie, par exemple, que vous ne pouvez pas définir la valeur par défaut pour une colonne de date comme étant la valeur d'une fonction telle que NOW () ou CURRENT_DATE".
Nicola Cossu
19
@Johan DATETIMEest souvent préférable de faire la plage qu'il peut contenir: '1000-01-01 00:00:00' à '9999-12-31 23:59:59' par rapport à TIMESTAMPS's' 1970-01-01 00: 00:01 'UTC à' 2038-01-19 03:14:07 'UTC. Dans le but de stocker des dates de naissance, ou quelque chose de plus de 30 ans dans le futur par exemple.
user17753
5
@nickrulez Vous n'êtes plus limité à timestampce comportement à partir de MySQL 5.6
Dan Esparza
70

J'utilise un déclencheur comme solution de contournement pour définir un champ datetime sur 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 & 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 la question datetime vs timestamp .

gardien
la source
4
Cela devrait être la réponse acceptée, mais vous devez spécifiquement la modifier pour la rendre évidente que c'est pour un champ datetime. L'affiche originale veut savoir comment le résoudre pour un champ datetime, et use a timestampest une solution insensée si vous apprenez vraiment la différence entre ces deux types de données.
phpguru
45

Ma solution

ALTER TABLE `table_name` MODIFY COLUMN `column_name` TIMESTAMP NOT
NULL DEFAULT CURRENT_TIMESTAMP;
Leonardo
la source
Cette définition 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 simple.
Immutable Brick
27
C'est toujours la solution pour la TIMESTAMPcolonne. Personne ne demandait TIMESTAMP...
Petr Peller
2
Oui, ce n'est pas la réponse à la question. TIMESTAMP est un type de champ différent de DATETIME.
John Hunt
@Leonardo comment afficher uniquement la date
151291
13

EUREKA !!!


Pour tous ceux qui ont perdu courage en essayant de définir une valeur DATETIME par défaut dans MySQL , je sais exactement ce que vous ressentez / ressentez. Voici donc:

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

Observez attentivement que je n'ai pas ajouté de guillemets simples / doubles entre le 0 .


Mise à jour importante :

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

Augiwan
la source
16
Cela dépend des attentes ... - Cette solution vous permet d'avoir le champ NOT NULL, car une valeur par défaut est fournie. - Cette solution ne définira pas le champ sur MAINTENANT ().
CodeReaper
10
Cela ne répond pas à la question d'origine; la réponse devrait l'indiquer clairement.
Matt Browne
2
N'oubliez pas que le mode SQL TRADITIONNEL inclut NO_ZERO_DATE, donc ce qui précède ne fonctionnera pas dans ce cas.
Móż
Sur la base des réponses fournies, il semble que si vous ne sacrifiez pas DATETIME pour être TIMESTAMP, vous devez utiliser des déclencheurs.
Chris
1
Cette solution aura des API folles avec "OMG c'est une date ZERO! Quelle hérésie! Nous ne pouvons pas convertir" ceci "en java.lang.Date/System.DateTime! OMG! -Crashes-".
Felype
4

Sur les versions mysql 5.6.5 et plus récentes, vous pouvez également utiliser des dates 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 à la fois à la date et à la fonction 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();
Matteius
la source
1
`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.

veelen
la source
1

La meilleure façon est d'utiliser "DEFAULT 0". Autre moyen:

    /************ 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();
Lucas Moyano Angelini
la source
0

Cela a fonctionné pour moi, en utilisant MySQL:

ALTER TABLE `table_name` MODIFY `column_name` datetime NOT NULL DEFAULT NOW();
Rosshump
la source
0
ALTER TABLE table_name
  CHANGE COLUMN date_column_name date_column_name DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;

Enfin, cela a fonctionné pour moi!

Eagle_Eye
la source
0
CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `dateCreated` datetime DEFAULT CURRENT_TIMESTAMP,
  `dateUpdated` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `mobile_UNIQUE` (`mobile`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
Gvs Akhil
la source
-1

Je ne sais pas si c'est toujours actif, mais c'est parti.

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

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

Ma version de mySQL est 5.5

George
la source
7
Peut être simplifié comme:INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', NOW())
user17753
-1

Cela a fonctionné pour moi - juste changé INSERT en UPDATE pour ma table.

INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))
Génération différente
la source