web-dev-qa-db-fra.com

MySQL CURRENT_TIMESTAMP sur créer et mettre à jour

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.

63
kuba

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.

55
Clement P

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.

14
avinash v p

Vous utilisez une version plus ancienne de MySql. Mettez à jour votre mysql vers 5.6.5+, cela fonctionnera.

5
Himanshu Shekhar

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
2
iKing

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

1
clemquinones

vous pouvez essayer ceci ts_create TIMESTAMP DEFAULT CURRENT_TIMESTAMP, ts_update TIMESTAMP DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP

0
AJavaLover

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.

0
Brian

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.

0
Nanne

C'est la toute petite limitation de Mysql dans l'ancienne version, après la version 5.6 et ultérieure, plusieurs horodatages fonctionnent ...

0