Je veux définir une table qui aura 2 champs TIMESTAMP, comme ceci:
CREATE TABLE `msgs` (
`id` INT PRIMARY KEY AUTO_INCREMENT,
`msg` VARCHAR(256),
`ts_create` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`ts_update` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
Comment faire cela en évitant les erreurs:
ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause
Le point est de garder le comportement souhaité de ts_create
et ts_update
dans le schéma de table.
Ceci est une limitation de MySQL, vous ne pouvez pas avoir deux colonnes TIMESTAMP avec des valeurs par défaut qui font référence à CURRENT_TIMESTAMP. La seule façon de le faire serait d'utiliser un type DATETIME pour ts_create qui, malheureusement, ne peut pas avoir une valeur par défaut de NOW (). Vous pouvez lancer votre propre déclencheur pour y arriver cependant.
Je suppose que c’est un vieux post, mais en fait, je suppose que mysql prend en charge 2 TIMESTAMP dans ses éditions récentes, mysql 5.6.25, c’est ce que j’utilise en ce moment.
Vous utilisez une version plus ancienne de MySql. Mettez à jour votre mysql vers 5.6.5+, cela fonctionnera.
je pense qu'il est possible d'utiliser la technique ci-dessous
`ts_create` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`ts_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
Vous ne pouvez pas avoir deux colonnes TIMESTAMP avec la même valeur par défaut de CURRENT_TIMESTAMP sur votre table. Veuillez vous référer à ce lien: http://www.mysqltutorial.org/mysql-timestamp.aspx
vous pouvez essayer ceci ts_create
TIMESTAMP DEFAULT CURRENT_TIMESTAMP, ts_update
TIMESTAMP DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP
Je pense que vous voulez peut-être ts_create comme date/heure (donc renommer -> dt_create) et uniquement ts_update comme horodatage? Cela garantira qu'il ne changera pas une fois défini.
D'après ce que j'ai compris, datetime correspond à des valeurs contrôlées manuellement, et l'horodatage est un peu "spécial" en ce sens que MySQL le conservera pour vous. Dans ce cas, datetime est donc un bon choix pour ts_create.
Je dirais que vous n'avez pas besoin d'avoir le nom DEFAULT CURRENT_TIMESTAMP sur votre ts_update: s'il est vide, il n'est pas mis à jour, votre "dernière mise à jour" est donc le ts_create.
C'est la toute petite limitation de Mysql dans l'ancienne version, après la version 5.6 et ultérieure, plusieurs horodatages fonctionnent ...