Comment définissez-vous une valeur par défaut pour une colonne MySQL Datetime?
Dans SQL Server, c'est getdate()
. Quel est l'équivalent pour MySQL? J'utilise MySQL 5.x si c'est un facteur.
Comment définissez-vous une valeur par défaut pour une colonne MySQL Datetime?
Dans SQL Server, c'est getdate()
. Quel est l'équivalent pour MySQL? J'utilise MySQL 5.x si c'est un facteur.
Réponses:
EDIT IMPORTANT: Il est désormais possible d'y parvenir avec les champs DATETIME depuis MySQL 5.6.5 , jetez un œil à l' autre post ci-dessous ...
Les versions précédentes ne peuvent pas faire cela 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>
** CAVEAT: SI vous définissez une colonne avec CURRENT_TIMESTAMP ON par défaut, vous devrez TOUJOURS spécifier 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 instruction UPDATE doit contenir "[votre nom de colonne] = [votre nom de colonne]" (ou une autre valeur) ou la valeur deviendra "maintenant ()". Bizarre, mais vrai. J'espère que ça aide. J'utilise 5.5.56-MariaDB **
DATE
colonne? (pas une datetime
colonne).
Dans la version 5.6.5, il est possible de définir une valeur par défaut sur une colonne datetime, et même de créer une colonne qui se mettra à jour lorsque la ligne sera 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
dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
MySQL ( avant la version 5.6.5 ) ne permet pas aux fonctions d'être utilisées pour les valeurs DateTime par défaut. TIMESTAMP ne convient pas en raison de son comportement étrange et n'est pas recommandé pour une utilisation en tant que données d'entrée. (Voir Valeurs par défaut du type de données MySQL .)
Cela dit, vous pouvez accomplir cela en créant un déclencheur .
J'ai une table avec un champ DateCreated de type DateTime. J'ai créé un déclencheur sur cette table "Before Insert" et " SET NEW.DateCreated=NOW()
" et cela fonctionne très bien.
J'espère que cela aide quelqu'un.
IF NEW.created_at IS NOT NULL
Pour moi, l'approche déclencheur a fonctionné le mieux, mais j'ai trouvé un problème avec l'approche. Considérez le déclencheur de base pour définir un champ de date à l'heure actuelle lors de l'insertion:
CREATE TRIGGER myTable_OnInsert BEFORE INSERT ON `tblMyTable`
FOR EACH ROW SET NEW.dateAdded = NOW();
C'est généralement génial, mais disons que vous souhaitez définir le champ manuellement via l'instruction INSERT, comme suit:
INSERT INTO tblMyTable(name, dateAdded) VALUES('Alice', '2010-01-03 04:30:43');
Ce qui se passe, c'est que le déclencheur écrase immédiatement la valeur fournie pour le champ, et donc la seule façon de définir une heure non courante est une instruction UPDATE de suivi - beurk! Pour remplacer ce comportement lorsqu'une valeur est fournie, essayez ce déclencheur légèrement modifié 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 de date et cela prendra, sinon il sera par défaut à l'heure actuelle. C'est toujours un ghetto par rapport à quelque chose de propre comme DEFAULT GETDATE () dans la définition du tableau, mais nous nous rapprochons!
NULL
. Plus d'avertissement.
dateAdded
affichera tout '0000-00-00 00:00:00'. Utiliser ceci fait l'affaire: `POUR CHAQUE RANG SI SI NEW.dateAdded = 0 ALORS REGLER NEW.dateAdded = NOW (); FIN SI; `
J'ai pu résoudre ce problème en utilisant cette instruction alter 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 vous attendez à ce que la fonction now () fonctionne. L'insertion de valeurs nulles ou l'ignorance des champs created_dt et updated_dt donne une valeur d'horodatage parfaite dans les deux champs. Toute mise à jour de la ligne modifie le updated_dt. Si vous insérez des enregistrements via le navigateur de requêtes MySQL, vous avez besoin d'une étape supplémentaire, un déclencheur pour gérer le created_dt avec un nouvel horodatage.
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 juste la convention de dénomination [trig] _ [my_table_name] _ [insert]
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;
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 / guillemets doubles autour du 0
Je saute littéralement après avoir résolu celui-ci: D
ALTER TABLE zones MODIFY created datetime NOT NULL DEFAULT 0;
MySQL 5.6 a résolu ce problème .
ALTER TABLE mytable CHANGE mydate datetime NOT NULL DEFAULT 'CURRENT_TIMESTAMP'
Si vous avez déjà créé la table, vous pouvez utiliser
Pour remplacer la valeur par défaut par l'heure de la date actuelle
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';
c'est en effet une terrible nouvelle. voici une longue demande de bug / fonctionnalité en attente pour cela . cette discussion parle également des limites du type de données d'horodatage.
Je me demande sérieusement quel est le problème avec la mise en œuvre de cette chose.
J'utilise 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 ce qui suit:
ALTER TABLE table_name CHANGE date_column datetime NOT NULL DEFAULT '1000-01-01 00:00:00'
fonctionne juste .
En tant que sidenote , il est mentionné dans les documents mysql :
Le type DATE est utilisé pour les valeurs avec une partie date mais pas de partie temps. MySQL récupère et affiche les valeurs DATE au format 'AAAA-MM-JJ'. La plage prise en charge est de '1000-01-01' à '9999-12-31'.
même s'ils disent aussi:
Les valeurs DATE, DATETIME ou TIMESTAMP non valides sont converties en la valeur «zéro» du type approprié («0000-00-00» ou «0000-00-00 00:00:00»).
Vous pouvez utiliser now () 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.
NOW()
et utilisez-la ultérieurement pour l'insertion. Pour la version 5.6, définissez simplement NOW()
la valeur par défaut.
Pour tous ceux qui utilisent la colonne TIMESTAMP comme 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 a une plage de '1970-01-01 00:00:01' UTC à ' 2038-01-19 03:14:07 ' UTC. Il a des propriétés variables, selon la version de MySQL et le SQL mode d'exécution du serveur. Ces propriétés sont décrites 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.
Lors de la définition de déclencheurs multilignes, il faut changer le délimiteur car le point-virgule sera pris par le compilateur MySQL comme fin de déclencheur et générer une 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 ;
Voici comment le faire sur MySQL 5.1:
ALTER TABLE `table_name` CHANGE `column_name` `column_name`
TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
Je ne sais pas pourquoi vous devez entrer le nom de la colonne deux fois.
Bien que vous ne puissiez 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 le manque de guillemets autour de la table.
Pour MySQL 5.5
Si vous essayez de définir la valeur par défaut comme NOW (), je ne pense pas que MySQL le supporte. Dans MySQL, vous ne pouvez pas utiliser une fonction ou une expression comme valeur par défaut pour tout type de colonne, à l'exception de la colonne de type de données TIMESTAMP, pour laquelle vous pouvez spécifier CURRENT_TIMESTAMP comme valeur par défaut.
Je pense que c'est simple dans mysql puisque mysql la fonction intégrée appelée now () qui donne l'heure actuelle (heure de cet insert).
Votre requête devrait donc ressembler à
CREATE TABLE defaultforTime(
`creation_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
`modification_time` DATETIME default now()
);
Je vous remercie.
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 «table de test», j'ai utilisé «1999-12-12 12:12:12» comme valeur par défaut pour la colonne DATETIME colname
Utilisez le code suivant
DELIMITER $$
CREATE TRIGGER bu_table1_each BEFORE UPDATE ON table1 FOR EACH ROW
BEGIN
SET new.datefield = NOW();
END $$
DELIMITER ;
Si vous essayez de définir la valeur par défaut comme NOW (), MySQL prend en charge que vous devez changer le type de cette colonne TIMESTAMP au lieu de DATETIME. TIMESTAMP a la date et l'heure actuelles par défaut .. je pense que cela résoudra votre problème ..
Prenez par exemple Si j'avais une table nommée 'site' avec une colonne created_at et une colonne update_at qui étaient toutes deux DATETIME et ont besoin de la valeur par défaut de now, je pourrais exécuter le sql suivant pour y parvenir.
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 d'instructions est importante car une table ne peut pas avoir deux colonnes de type TIMESTAMP avec des valeurs par défaut CUREENT TIMESTAMP
Ceci est mon exemple déclencheur:
/************ 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();
Fonctionne bien avec MySQL 8.x
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;
Vous pouvez résoudre l'horodatage par défaut. Réfléchissez d'abord au jeu de caractères que vous utilisez, par exemple si u pris utf8, ce jeu de caractères prend en charge toutes les langues et si u pris laten1, ce jeu de caractères ne prend en charge que l'anglais. Si vous travaillez sous un projet, vous devez connaître le fuseau horaire du client et sélectionner votre zone client. Cette étape est obligatoire.