Pourquoi il ne peut y avoir qu'une seule colonne TIMESTAMP avec CURRENT_TIMESTAMP dans la clause DEFAULT ou ON UPDATE?
CREATE TABLE `foo` (
`ProductID` INT(10) UNSIGNED NOT NULL,
`AddedDate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`UpdatedDate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=INNODB;
L'erreur qui en résulte:
Code d'erreur: 1293
Définition de table incorrecte; il ne peut y avoir qu'une seule colonne TIMESTAMP avec CURRENT_TIMESTAMP dans la clause DEFAULT ou ON UPDATE
mysql
timestamp
mysql-error-1293
ripper234
la source
la source
CURRENT_TIMESTAMP
inDEFAULT
ouON UPDATE
une fois qu'il y a une colonne avecTIMESTAMP
un type de données, peu importe si elle a une clause supplémentaire!CREATE TABLE foo (created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_on TIMESTAMP)
CREATE TABLE foo (updated_on TIMESTAMP, created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP)
timestamp
colonne est nullable ienull
. Si la premièretimestamp
colonne estnot null
alors par défautDEFAULT CURRENT_TIMESTAMP
etON UPDATE CURRENT_TIMESTAMP
sera ajoutée. stackoverflow.com/a/13544181/2859238timestamp
colonne a une valeur par défaut explicite définie commedefault '0000-00-00 00:00:00'
. Si la colonne est Nullable ou si la valeur par défaut est explicitement définie, alorsDEFAULT CURRENT_TIMESTAMP
etON UPDATE CURRENT_TIMESTAMP
ne sera PAS ajoutéeRéponses:
Cette limitation, qui était uniquement due à des raisons historiques d'héritage du code, a été levée dans les versions récentes de MySQL:
http://dev.mysql.com/doc/relnotes/mysql/5.6/en/news-5-6-5.html
la source
Je me suis également posé la question il y a longtemps. J'ai cherché un peu dans mon histoire et je pense que ce post: http://lists.mysql.com/internals/34919 représente la position semi-officielle de MySQL (avant l'intervention d'Oracle;))
En bref:
Leur explication est donc "parce que c'est implémenté comme ça". Cela ne semble pas très scientifique. Je suppose que tout vient d'un vieux code. Ceci est suggéré dans le fil ci-dessus: "report à partir du moment où seul le premier champ d'horodatage a été auto-défini / mis à jour".
À votre santé!
la source
Nous pouvons donner une valeur par défaut pour l'horodatage pour éviter ce problème.
Cet article propose une solution de contournement détaillée: http://gusiev.com/2009/04/update-and-create-timestamps-with-mysql/
la source
En effet un défaut de mise en œuvre.
L'approche native de MySQL consiste à mettre à jour une date de création vous-même (si vous en avez besoin) et à faire en sorte que MySQL se soucie de l' horodatage
update date ? update date : creation date
comme ceci:CREATE TABLE tracked_data( `data` TEXT, `timestamp` TIMESTAMP, `creation_date` TIMESTAMP ) ENGINE=INNODB;
Lors de la création, insérer NULL:
INSERT INTO tracked_data(`data`,`creation_date`) VALUES ('creation..',NULL);
Les valeurs NULL pour l'horodatage sont interpertées comme CURRENT_TIMESTAMP par défaut.
Dans MySQL, la première colonne TIMESTAMP d'une table obtient à la fois
DEFAULT CURRENT_TIMESTAMP
etON UPDATE CURRENT_TIMESTAMP
attribut, si aucun attribut n'est donné pour elle. c'est pourquoi la colonne TIMESTAMP avec les attributs doit venir en premier ou vous obtenez l'erreur décrite dans ce fil.la source
Tel que:
DROP TRIGGER IF EXISTS `update_tablename_trigger`; DELIMITER // CREATE TRIGGER `update_tablename_trigger` BEFORE UPDATE ON `tablename` FOR EACH ROW SET NEW.`column_name` = NOW() // DELIMITER ;
la source
Eh bien, un correctif pour vous pourrait être de le mettre dans le champ UpdatedDate et d'avoir un déclencheur qui met à jour le champ AddedDate avec la valeur UpdatedDate uniquement si AddedDate est nul.
la source
Combinaison de différentes réponses:
Dans MySQL 5.5,
DEFAULT CURRENT_TIMESTAMP
etON UPDATE CURRENT_TIMESTAMP
ne peut pas être ajoutéDATETIME
mais uniquement surTIMESTAMP
.Règles:
1) au plus une
TIMESTAMP
colonne par table pourrait être automatiquement (ou manuellement [ Mon ajout ]) initialisée ou mise à jour à la date et à l'heure actuelles. (Documents MySQL).Donc, un seul
TIMESTAMP
peut avoirCURRENT_TIMESTAMP
dansDEFAULT
ouON UPDATE
clause2) La première
NOT NULL
TIMESTAMP
colonne sansDEFAULT
valeur explicite commecreated_date timestamp default '0000-00-00 00:00:00'
sera implicitement donnée aDEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
et donc lesTIMESTAMP
colonnes suivantes ne peuvent pas être donnéesCURRENT_TIMESTAMP
sur la clauseDEFAULT
orON UPDATE
CREATE TABLE `address` ( `id` int(9) NOT NULL AUTO_INCREMENT, `village` int(11) DEFAULT NULL, `created_date` timestamp default '0000-00-00 00:00:00', -- Since explicit DEFAULT value that is not CURRENT_TIMESTAMP is assigned for a NOT NULL column, -- implicit DEFAULT CURRENT_TIMESTAMP is avoided. -- So it allows us to set ON UPDATE CURRENT_TIMESTAMP on 'updated_date' column. -- How does setting DEFAULT to '0000-00-00 00:00:00' instead of CURRENT_TIMESTAMP help? -- It is just a temporary value. -- On INSERT of explicit NULL into the column inserts current timestamp. -- `created_date` timestamp not null default '0000-00-00 00:00:00', // same as above -- `created_date` timestamp null default '0000-00-00 00:00:00', -- inserting 'null' explicitly in INSERT statement inserts null (Ignoring the column inserts the default value)! -- Remember we need current timestamp on insert of 'null'. So this won't work. -- `created_date` timestamp null , // always inserts null. Equally useless as above. -- `created_date` timestamp default 0, // alternative to '0000-00-00 00:00:00' -- `created_date` timestamp, -- first 'not null' timestamp column without 'default' value. -- So implicitly adds DEFAULT CURRENT_TIMESTAMP and ON UPDATE CURRENT_TIMESTAMP. -- Hence cannot add 'ON UPDATE CURRENT_TIMESTAMP' on 'updated_date' column. `updated_date` timestamp null on update current_timestamp, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=132 DEFAULT CHARSET=utf8;
INSERT INTO address (village,created_date) VALUES (100,null);
mysql> select * from address; +-----+---------+---------------------+--------------+ | id | village | created_date | updated_date | +-----+---------+---------------------+--------------+ | 132 | 100 | 2017-02-18 04:04:00 | NULL | +-----+---------+---------------------+--------------+ 1 row in set (0.00 sec)
UPDATE address SET village=101 WHERE village=100;
mysql> select * from address; +-----+---------+---------------------+---------------------+ | id | village | created_date | updated_date | +-----+---------+---------------------+---------------------+ | 132 | 101 | 2017-02-18 04:04:00 | 2017-02-18 04:06:14 | +-----+---------+---------------------+---------------------+ 1 row in set (0.00 sec)
Autre option (mais
updated_date
est la première colonne):CREATE TABLE `address` ( `id` int(9) NOT NULL AUTO_INCREMENT, `village` int(11) DEFAULT NULL, `updated_date` timestamp null on update current_timestamp, `created_date` timestamp not null , -- implicit default is '0000-00-00 00:00:00' from 2nd timestamp onwards -- `created_date` timestamp not null default '0000-00-00 00:00:00' -- `created_date` timestamp -- `created_date` timestamp default '0000-00-00 00:00:00' PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=132 DEFAULT CHARSET=utf8;
la source
Essaye ça:
CREATE TABLE `test_table` ( `id` INT( 10 ) NOT NULL, `created_at` TIMESTAMP NOT NULL DEFAULT 0, `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE = INNODB;
la source
created_at
colonne vous-même. Je pense que c'est ce que op veut dire intentionnellement.C'est la limitation de la version MYSQL 5.5. Vous devez mettre à jour la version à 5.6.
J'obtenais cette erreur en ajoutant une table dans MYSQL
la table ressemble à quelque chose comme ça.
Après un certain temps de lecture sur les changements dans les différentes versions de MYSQL et une partie de la recherche sur Google. J'ai découvert que certaines modifications avaient été apportées à la version 5.6 de MYSQL par rapport à la version 5.5.
Cet article vous aidera à résoudre le problème. http://www.oyewiki.com/MYSQL/Incorrect-table-definition-there-can-be-only-one-timestamp-column
la source