186 votes

Pourquoi il ne peut y avoir qu'une seule colonne TIMESTAMP avec la clause CURRENT_TIMESTAMP dans DEFAULT?

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

179voto

augustin Points 2669

Cette limitation, qui n'était que le fruit de l'histoire, du code des raisons d'héritage, a été levé dans les versions récentes de MySQL:

Les changements dans MySQL 5.6.5 (2012-04-10, Étape 8)

Auparavant, au plus une colonne de type TIMESTAMP par le tableau pourrait être automatiquement initialisé ou mis à jour à la date et l'heure actuelles. Cette restriction a été levée. Toute colonne TIMESTAMP définition avoir n'importe quelle combinaison de DÉFAUT CURRENT_TIMESTAMP et SUR la mise à JOUR CURRENT_TIMESTAMP clauses. En outre, ces clauses ne peuvent plus être utilisés avec DATETIME définitions de colonne. Pour plus d'informations, voir Automatique L'initialisation et la mise à Jour de cachet de date et DATETIME.

http://dev.mysql.com/doc/relnotes/mysql/5.6/en/news-5-6-5.html

40voto

lucho Points 2320

Je me demandais aussi qu'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 semi-position officielle de MySQL (avant d'Oracle intervention ;))

En bref:

cette limitation découle uniquement de l' façon dont cette fonctionnalité est actuellement mis en œuvre dans le serveur et il n'y sont pas d'autres raisons pour son de l'existence.

De sorte que leur explication: "parce qu'il est mis en œuvre comme cela". Ne sonne pas très scientifique. Je suppose que tout cela provient d'un ancien code. Ce qui est suggéré dans le thread ci-dessus: "reliquat de l'époque où seul le premier champ d'horodatage a été auto-set/mettre à jour".

Cheers!

38voto

Scarlett Points 343

nous pouvons donner une valeur par défaut pour l'horodatage afin d'éviter ce problème. ce post donne le détail du contournement http://gusiev.com/2009/04/update-and-create-timestamps-with-mysql/

17voto

mooli Points 138

En effet, une mise en œuvre faute.

L'approche autochtone dans MySQL est de mettre à jour la date de création vous-même ( si vous en avez besoin ) et MySQL vous soucier de l' horodatage update date ? update date : creation date comme:

CREATE TABLE tracked_data( 
  `data` TEXT,
  `timestamp`   TIMESTAMP,
  `creation_date` TIMESTAMP                                   
) ENGINE=INNODB; 

Sur la création d'Insérer la valeur NULL:

INSERT INTO tracked_data(`data`,`creation_date`) VALUES ('creation..',NULL);

Les valeurs NULL pour d'horodatage sont interperted comme CURRENT_TIMESTAMP par défaut.

Dans MySQL la première colonne TIMESTAMP d'une table obtient les deux DEFAULT CURRENT_TIMESTAMP et ON UPDATE CURRENT_TIMESTAMP d'attribut, si aucun des attributs sont donnés. c'est pourquoi la colonne TIMESTAMP avec des attributs doit venir en premier ou vous obtenez le message d'erreur décrit dans ce fil.

14voto

Feng-Chun Ting Points 388

1.changez les types de données des colonnes à datetime 2.set trigger comme:

 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 ;
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X