Dlaczego może istnieć tylko jedna kolumna TIMESTAMP z CURRENT_TIMESTAMP w klauzuli DEFAULT lub 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;
Błąd, który powoduje:
Kod błędu: 1293
Niepoprawna definicja tabeli; może być tylko jedna kolumna TIMESTAMP z CURRENT_TIMESTAMP w klauzuli DEFAULT lub ON UPDATE
mysql
timestamp
mysql-error-1293
ripper234
źródło
źródło
CURRENT_TIMESTAMP
wDEFAULT
lubON UPDATE
klauzuli raz tam kolumna zTIMESTAMP
typem danych, bez względu na to, czy to ma dodatkową klauzulę!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
kolumna ma wartość zerową, tjnull
. Jeśli pierwszatimestamp
kolumna jestnot null
domyślnieDEFAULT CURRENT_TIMESTAMP
iON UPDATE CURRENT_TIMESTAMP
zostanie dodana. stackoverflow.com/a/13544181/2859238timestamp
kolumna ma jawną wartość domyślną ustawioną jakdefault '0000-00-00 00:00:00'
. Jeśli kolumna jest pustych lub wyraźnie wartość domyślna jest ustawiona, wtedyDEFAULT CURRENT_TIMESTAMP
iON UPDATE CURRENT_TIMESTAMP
nie zostanie dodanyOdpowiedzi:
To ograniczenie, które było spowodowane wyłącznie historycznymi, starszymi przyczynami kodu, zostało zniesione w najnowszych wersjach MySQL:
http://dev.mysql.com/doc/relnotes/mysql/5.6/en/news-5-6-5.html
źródło
Zastanawiałem się też dawno temu. Przeszukałem trochę w swojej historii i myślę, że ten post: http://lists.mysql.com/internals/34919 reprezentuje półoficjalne stanowisko MySQL (przed interwencją Oracle;))
W skrócie:
Ich wyjaśnienie brzmi „ponieważ jest realizowane w ten sposób”. Nie brzmi to zbyt naukowo. Myślę, że wszystko pochodzi od jakiegoś starego kodu. Zasugerowano to w powyższym wątku: „przeniesienie, gdy tylko pierwsze pole znacznika czasu było automatycznie ustawiane / aktualizowane”.
Twoje zdrowie!
źródło
Możemy podać wartość domyślną znacznika czasu, aby uniknąć tego problemu.
Ten post zawiera szczegółowe obejście: http://gusiev.com/2009/04/update-and-create-timestamps-with-mysql/
źródło
Rzeczywiście błąd implementacji.
Natywne podejście w MySQL polega na tym, aby samodzielnie zaktualizować datę utworzenia (jeśli jest taka potrzeba) i zmusić MySQL do martwienia się o znacznik czasu
update date ? update date : creation date
:Podczas tworzenia wstaw NULL:
Wartości NULL dla znacznika czasu są domyślnie interpretowane jako CURRENT_TIMESTAMP.
W MySQL pierwsza kolumna TIMESTAMP tabeli otrzymuje oba atrybuty
DEFAULT CURRENT_TIMESTAMP
iON UPDATE CURRENT_TIMESTAMP
atrybuty, jeśli nie podano dla niego żadnych atrybutów. dlatego kolumna TIMESTAMP z atrybutami musi być pierwsza lub pojawi się błąd opisany w tym wątku.źródło
Jak na przykład:
źródło
Cóż, poprawką może być umieszczenie go w polu UpdatedDate i uruchomienie wyzwalacza, który aktualizuje pole Dodane data o wartości Aktualizowane tylko wtedy, gdy Dodane jest puste.
źródło
Łączenie różnych odpowiedzi:
W MySQL 5.5
DEFAULT CURRENT_TIMESTAMP
iON UPDATE CURRENT_TIMESTAMP
nie można go dodawać,DATETIME
ale tylko naTIMESTAMP
.Zasady:
1) najwyżej jedna
TIMESTAMP
kolumna na tabelę może być automatycznie (lub ręcznie [ Moje dodanie ]) zainicjowana lub zaktualizowana do bieżącej daty i godziny. (Dokumenty MySQL).Więc tylko jeden
TIMESTAMP
może miećCURRENT_TIMESTAMP
wDEFAULT
lubON UPDATE
klauzulę2) Pierwsza
NOT NULL
TIMESTAMP
kolumna bez wyraźnejDEFAULT
wartości jakcreated_date timestamp default '0000-00-00 00:00:00'
zostaną niejawnie daliDEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
i stąd kolejneTIMESTAMP
kolumny nie może być udzielonaCURRENT_TIMESTAMP
naDEFAULT
lubON UPDATE
klauzuliInna opcja (ale
updated_date
to pierwsza kolumna):źródło
Spróbuj tego:
źródło
created_at
kolumnę. Myślę, że właśnie to chce powiedzieć celowo.Jest to ograniczenie w wersji MYSQL 5.5. Musisz zaktualizować wersję do 5.6.
Ten błąd pojawiał się podczas dodawania tabeli w MYSQL
stół wygląda mniej więcej tak.
Po pewnym czasie czytania o zmianach w różnych wersjach MYSQL i niektórych googlingach. Dowiedziałem się, że w MYSQL w wersji 5.6 wprowadzono pewne zmiany w stosunku do wersji 5.5.
Ten artykuł pomoże ci rozwiązać problem. http://www.oyewiki.com/MYSQL/Incorrect-table-definition-there-can-be-only-one-timestamp-column
źródło