Mysql
 sql >> Base de données >  >> RDS >> Mysql

Valeur MAINTENANT par défaut de l'horodatage MySQL à deux colonnes ERREUR 1067

Vous ne pouvez en avoir qu'un colonne d'horodatage dont la valeur par défaut est CURRENT_TIMESTAMP ou NOW() par tableau. Il s'agit d'un bogue bien connu dans MySQL.

Pour surmonter cela, faites de votre valeur par défaut pour la colonne créée une valeur d'horodatage valide, puis insérez l'horodatage dans votre code d'application CRUD. Utilisez NOW() ou CURRENT_TIMESTAMP pour votre valeur par défaut de colonne mise à jour.

Matériel de référence :http://dev.mysql.com/doc/ refman/5.1/fr/horodatage.html

Pour illustrer davantage la lacune de MySQL dans ce domaine, considérons le code suivant :

CREATE TABLE testing_timestamps (
  id INT NOT NULL AUTO_INCREMENT,
  pk_id INT NOT NULL,
  col1 TIMESTAMP DEFAULT 0,
  col2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY(id)
);

delimiter $$
CREATE TRIGGER testing_timestamps_trigger
  AFTER INSERT ON testing_timestamps
  FOR EACH ROW 
  BEGIN
    UPDATE testing_timestamps SET col1 = NOW() WHERE id = MAX(id);
  END;
$$
delimiter ;

INSERT INTO testing_timestamps (id) VALUES (0);

La sortie de ceci affichera :

mysql> INSERT INTO testing_timestamps (id) VALUES (0);
ERROR 1442 (HY000): Can't update table 'testing_timestamps' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

C'est dommage car l'utilisation d'un déclencheur dans ce cas serait une bonne solution.