2011-01-07 3 views
1

J'ai une table, Où j'ai besoin à la fois firstmod et lastmodMySQL, Table avec deux dates?

firstmod doit être l'horodatage de puis la ligne a été créée. lastmod doit se mettre à jour à l'heure actuelle.

C'est ce que j'ai jusqu'à présent ..

CREATE TABLE IF NOT EXISTS `SiteGen_JamesM_Live`.`PAGES` (
    `ID` INT(11) NOT NULL AUTO_INCREMENT , 
    `USER_ID` INT(11) NOT NULL , 
    `TITLE` VARCHAR(100) NOT NULL , 
    `HTML` LONGTEXT NOT NULL , 
    `FIRSTMOD` TIMESTAMP NOT NULL DEFAULT 0 , 
    `LASTMOD` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP , 
    PRIMARY KEY (`ID`)) 
ENGINE = InnoDB 
AUTO_INCREMENT = 5 
DEFAULT CHARACTER SET = latin1 

Et voici ce que je reçois en retour:

Executing SQL script in server 
ERROR: Error 1067: Invalid default value for 'FIRSTMOD' 
+0

Je ne connais pas la méthode que Paul suggère, mais je doute que cela fonctionne. '0000-00-00 00:00:00' n'est pas une valeur par défaut valide pour un horodatage (puisqu'il commence à partir de '1970-01-01 00:00:00'). Vous pouvez essayer d'utiliser 0 à la place, mais cela ne fera rien. – Mchl

+0

treid zéro ne va pas, au travail ?! –

+0

Peut-être à cause de ça: http://dev.mysql.com/doc/refman/5.5/fr/server-sql-mode.html#sqlmode_allow_invalid_dates Je pense toujours que ça ne marchera pas. – Mchl

Répondre

0

Je vais courir le risque de répondre même si je ne suis pas que familier avec MySQL.

Je suppose que la colonne lastmod doit être définie:

`LASTMOD` TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP , 

sans spécifier DEFAULT. Sa valeur par défaut passera par la clause ON UPDATE.

EDIT:

Oops, ne devrait pas risquer ces choses. A partir du manuel:

Il est impossible d'avoir l'horodatage en cours être la valeur par défaut pour une colonne et la valeur mise à jour automatique pour une autre colonne.

+0

Merci, n'a pas fonctionné et est source de confusion .. Je voudrais +1 pour tenter si inscrit. :) –

+0

modifications en question! –

+0

Les pages de manuel MySQL montrent DEFAULT 0 comme utilisation correcte, et nécessitent un drapeau permettant 0 dates dans la base de données. Alternativement, vous pouvez utiliser une date réelle là-bas. –

0

Il ne peut y avoir qu'une seule colonne avec CURRENT_TIMESTAMP dans une table. Vous devez choisir, que ce soit avec DEFAULT (sur insert) ou avec ON UPDATE (ou vous pouvez avoir les deux modificateurs, mais dans une colonne).

Il y a un truc pour avoir les deux, mais comme il n'est pas documenté, il est aussi peu fiable (en fait je ne suis pas sûr que ça marche encore).

Voir plus ici: http://dev.mysql.com/doc/refman/5.5/en/timestamp.html

Pour une colonne TIMESTAMP dans une table, vous pouvez attribuer l'horodatage en cours comme la valeur par défaut et la valeur mise à jour automatique. Il est possible de que l'horodatage actuel soit la valeur par défaut pour initialiser la colonne , pour la valeur de mise à jour automatique, ou les deux. Il est impossible d'avoir le horodatage actuel soit la valeur par défaut pour une colonne et la valeur mise à jour automatique pour une autre colonne

Pour contourner ce problème, vous pouvez utiliser un INSERT AVANT ou trigger BEFORE UPDATE pour définir une de ces valeurs.

+0

modifications en question! –

0

Essayez ceci:

`FIRSTMOD` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00' , 
`LASTMOD` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP , 

puis dans vos inserts

INSERT INTO PAGES (FIRSTMOD, LASTMOD) VALUES (NULL, NULL) 

La colonne FIRSTMOD devrait obtenir un horodatage valide sur insert et le lastmod doit mettre à jour automatique par la suite.

+0

okay, mais inclura d'abord le timedate correct? –

+0

modifications en question! –

+0

Oui, il devrait. Il y a un tas de commentaires utiles à http://dev.mysql.com/doc/refman/5.0/en/timestamp.html et aussi quelques suggestions alternatives, y compris l'utilisation de déclencheurs pour faire les mises à jour (ce qui est un peu plus de travail pour mettre en place, mais ne nécessite pas de passer NULL à ces champs dans l'INSERT). –

0

essayer cette

CREATE TABLE IF NOT EXISTS `PAGES` (
    `ID` INT(11) NOT NULL AUTO_INCREMENT , 
    `USER_ID` INT(11) NOT NULL , 
    `TITLE` VARCHAR(100) NOT NULL , 
    `HTML` LONGTEXT NOT NULL , 
    `FIRSTMOD` datetime NOT NULL, 
    `LASTMOD` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP , 
    PRIMARY KEY (`ID`)) 
ENGINE = InnoDB 
AUTO_INCREMENT = 5 
DEFAULT CHARACTER SET = latin1 

et mettre en place un déclencheur pour mettre à jour FIRSTMOD sur insert

Create Trigger Insert_PAGES 
    After INSERT On PAGES 
    For Each Row 
    Begin 
    set new.FIRSTMOD = now(); 
    End 

Cela va régler le temps de firstmod = maintenant() lorsque l'enregistrement est créé et lastmod va se mettre à jour à l'heure actuelle lorsque des modifications sont apportées à l'enregistrement

Questions connexes