Mam następujący schemat tabeli;
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;
Niepowodzenie z następującym błędem:
ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause.
Moje pytanie brzmi, czy mogę mieć oba te pola? czy też muszę ręcznie ustawić pole LastUpdated podczas każdej transakcji?
mysql
mysql-error-1293
Xenph Yan
źródło
źródło
Odpowiedzi:
Z dokumentacji MySQL 5.5 :
Zmiany w MySQL 5.6.5 :
źródło
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.
Istnieje pewna sztuczka, aby mieć oba znaczniki czasu, ale z niewielkimi ograniczeniami.
Możesz użyć tylko jednej definicji w jednej tabeli. Utwórz obie kolumny ze znacznikami czasu w następujący sposób:
Zwróć uwagę, że konieczne jest wpisanie
null
do obu kolumn podczasinsert
:źródło
stamp_created
jest to również ustawione jako NIE NULL. MySQL automatycznie zastąpi NULL aktualnym znacznikiem czasu.stamp_created
pola jako:stamp_created timestamp default now()
zamiast używać wartości „ZERO”?Możesz mieć oba, po prostu zdejmij flagę „CURRENT_TIMESTAMP” na utworzonym polu. Za każdym razem, gdy tworzysz nowy rekord w tabeli, po prostu użyj „NOW ()” jako wartości.
Lub.
Wręcz przeciwnie, usuń flagę „ON UPDATE CURRENT_TIMESTAMP” i wyślij NOW () dla tego pola. W ten sposób ma więcej sensu.
źródło
Jeśli zdecydujesz się, aby MySQL zajmował się aktualizacją znaczników czasu, możesz ustawić wyzwalacz, aby zaktualizować pole przy wstawianiu.
Źródła MySQL: http://dev.mysql.com/doc/refman/5.0/en/triggers.html
źródło
W ten sposób możesz mieć automatyczne i elastyczne pola createDate / lastModified za pomocą wyzwalaczy:
Najpierw zdefiniuj je w ten sposób:
Następnie dodaj te wyzwalacze:
Ale oto fajna część:
źródło
Od MySQL 5.6 jest to łatwe ... spróbuj:
źródło
Wydawało się, że ten problem został rozwiązany w MySQL 5.6. Zauważyłem to do MySQL 5.5; oto przykładowy kod:
Uruchomienie tego na MySQL 5.5 daje:
Uruchomienie tego na MySQL 5.6
źródło
źródło: http://gusiev.com/2009/04/update-and-create-timestamps-with-mysql/
źródło
W przypadku mysql 5.7.21 używam następujących i działa dobrze:
CREATE TABLE
Posts
(modified_at
sygnatura czasowa NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,created_at
sygnatura czasowa NOT NULL DEFAULT CURRENT_TIMESTAMP)źródło
Myślę, że jest to lepsze zapytanie dla stamp_created i stamp_updated
bo kiedy tworzony rekord,
stamp_created
powinien być wypełnionynow()
istamp_updated
powinien być wypełniony przez'0000-00-00 00:00:00'
źródło
Mój host sieciowy utknął w wersji 5.1 mysql, więc każdy taki jak ja, który nie ma opcji aktualizacji, może postępować zgodnie z tymi wskazówkami:
http://joegornick.com/2009/12/30/mysql-created-and-modified-date-fields/
źródło