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.
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?
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
)
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.
Ma solution
ALTER TABLE `table_name` MODIFY COLUMN `column_name` TIMESTAMP NOT
NULL DEFAULT CURRENT_TIMESTAMP;
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.
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
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();
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();
`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.
ALTER TABLE table_name
CHANGE COLUMN date_column_name date_column_name DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;
Enfin, cela a fonctionné pour moi!
Cela a fonctionné pour moi, en utilisant MySQL:
ALTER TABLE `table_name` MODIFY `column_name` datetime NOT NULL DEFAULT NOW();