J'ai le schéma de table suivant;
CREATE TABLE `db1`.`sms_queue` (
`Id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`Message` VARCHAR(160) NOT NULL DEFAULT 'Unknown Message Error',
`CurrentState` VARCHAR(10) NOT NULL DEFAULT 'None',
`Phone` VARCHAR(14) DEFAULT NULL,
`Created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`LastUpdated` TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP,
`TriesLeft` tinyint NOT NULL DEFAULT 3,
PRIMARY KEY (`Id`)
)
ENGINE = InnoDB;
Il échoue avec l'erreur suivante:
ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause.
Ma question est la suivante: puis-je avoir ces deux champs? ou dois-je définir manuellement un champ LastUpdated lors de chaque transaction?
mysql
mysql-error-1293
Xenph Yan
la source
la source
Réponses:
À partir de la documentation MySQL 5.5 :
Changements dans MySQL 5.6.5 :
la source
Changes in MySQL 5.6.5 (2012-04-10, Milestone 8) Previously, at most one TIMESTAMP column per table could be automatically initialized or updated to the current date and time. This restriction has been lifted. Any TIMESTAMP column definition can have any combination of DEFAULT CURRENT_TIMESTAMP and ON UPDATE CURRENT_TIMESTAMP clauses. In addition, these clauses now can be used with DATETIME column definitions. For more information, see Automatic Initialization and Updating for TIMESTAMP and DATETIME.
Il y a une astuce pour avoir les deux horodatages, mais avec une petite limitation.
Vous ne pouvez utiliser qu'une seule des définitions dans une table. Créez les deux colonnes d'horodatage comme ceci:
Notez qu'il est nécessaire d'entrer
null
dans les deux colonnes pendantinsert
:la source
stamp_created
paramètre est également défini sur NOT NULL. MySQL remplacera automatiquement le NULL par l'horodatage actuel.stamp_created
champ comme:stamp_created timestamp default now()
au lieu d'utiliser une valeur «ZERO»?Vous pouvez les avoir tous les deux, il suffit de décoller l'indicateur "CURRENT_TIMESTAMP" sur le champ créé. Chaque fois que vous créez un nouvel enregistrement dans la table, utilisez simplement "NOW ()" pour une valeur.
Ou.
Au contraire, supprimez l'indicateur «ON UPDATE CURRENT_TIMESTAMP» et envoyez le NOW () pour ce champ. De cette façon, cela a plus de sens.
la source
Si vous décidez que MySQL gère la mise à jour des horodatages, vous pouvez configurer un déclencheur pour mettre à jour le champ lors de l'insertion.
Référence MySQL: http://dev.mysql.com/doc/refman/5.0/en/triggers.html
la source
Voici comment avoir des champs createDate / lastModified automatiques et flexibles à l'aide de déclencheurs:
Définissez-les d'abord comme ceci:
Ajoutez ensuite ces déclencheurs:
Mais voici la belle partie:
la source
Depuis MySQL 5.6, c'est facile ... essayez-le:
la source
Ce problème semble avoir été résolu dans MySQL 5.6. J'ai remarqué cela jusqu'à MySQL 5.5; voici un exemple de code:
L'exécuter sur MySQL 5.5 donne:
Exécuter ceci sur MySQL 5.6
la source
source: http://gusiev.com/2009/04/update-and-create-timestamps-with-mysql/
la source
Pour mysql 5.7.21, j'utilise ce qui suit et fonctionne très bien:
CREATE TABLE
Posts
(modified_at
horodatage NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,created_at
horodatage NOT NULL DEFAULT CURRENT_TIMESTAMP)la source
je pense que c'est la meilleure requête pour stamp_created et stamp_updated
car lorsque l'enregistrement créé,
stamp_created
doit être rempli parnow()
etstamp_updated
doit être rempli par'0000-00-00 00:00:00'
la source
Mon hébergeur est bloqué sur la version 5.1 de mysql, donc toute personne comme moi qui n'a pas la possibilité de mettre à niveau peut suivre ces instructions:
http://joegornick.com/2009/12/30/mysql-created-and-modified-date-fields/
la source