Mam dwie kolumny w tabeli użytkowników, a mianowicie, registerDate and lastVisitDate
które składają się z typu danych datetime. Chciałbym wykonać następujące czynności.
- Ustaw wartość domyślną registerDate na MySQL NOW ()
- Ustaw wartość domyślną lastVisitDate na
0000-00-00 00:00:00
Zamiast pustej, której używa domyślnie.
Ponieważ tabela już istnieje i zawiera istniejące rekordy, chciałbym użyć tabeli Modyfikuj. Próbowałem użyć dwóch fragmentów kodu poniżej, ale żaden z nich nie działa.
ALTER TABLE users MODIFY registerDate datetime DEFAULT NOW()
ALTER TABLE users MODIFY registerDate datetime DEFAULT CURRENT_TIMESTAMP;
To daje mi błąd: ERROR 1067 (42000): Invalid default value for 'registerDate'
Czy mogę ustawić domyślną wartość daty / godziny na NOW () w MySQL?
mysql
sql
datetime
mysql-error-1067
Ibrahim Azhar Armar
źródło
źródło
ALTER TABLE users MODIFY dateTime timestamp default CURRENT_TIMESTAMP
. Nie zdefiniowałeśdata type
pola w obu swoich wysiłkachDATE
powinien działać z wartością domyślnąNOW()
Odpowiedzi:
Począwszy od MySQL 5.6.5, możesz używać tego
DATETIME
typu z dynamiczną wartością domyślną:Lub nawet połączyć obie zasady:
Odniesienie:
http://dev.mysql.com/doc/refman/5.7/en/timestamp-initialization.html
http://optimize-this.blogspot.com/2012/04/datetime-default-now-finally-available .html
Przed wersją 5.6.5 należy użyć
TIMESTAMP
typu danych, który aktualizuje się automatycznie po każdej modyfikacji rekordu. Niestety,TIMESTAMP
w tabeli może istnieć tylko jedno automatycznie aktualizowane pole.Zobacz: http://dev.mysql.com/doc/refman/5.1/en/create-table.html
Jeśli chcesz uniemożliwić MySQLowi aktualizowanie wartości znacznika czasu na
UPDATE
(tak, aby włączała się tylkoINSERT
), możesz zmienić definicję na:źródło
DATETIME
często preferuje zakres, który może pomieścić: „1000-01-01 00:00:00” do „9999-12-31 23:59:59” w porównaniu doTIMESTAMPS
„s” 1970-01-01 00: 00:01 'UTC do' 2038-01-19 03:14:07 'UTC. Na przykład do przechowywania dat urodzenia lub czegoś więcej niż 30 lat w przyszłości.timestamp
tego zachowania od MySQL 5.6Używam wyzwalacza jako obejścia, aby ustawić pole daty i godziny na NOW () dla nowych wstawek:
powinien również działać w przypadku aktualizacji
Odpowiedzi Johana i Leonarda dotyczą konwersji na pole znacznika czasu. Chociaż jest to prawdopodobnie odpowiednie dla przypadku użycia przedstawionego w pytaniu (przechowywanie RegisterDate i LastVisitDate), nie jest to rozwiązanie uniwersalne. Zobacz pytanie datetime vs datownik .
źródło
use a timestamp
daty i godziny, i jest głupim obejściem, jeśli naprawdę poznasz różnicę między tymi dwoma typami danych.Moje rozwiązanie
źródło
TIMESTAMP
kolumny. Nikt nie prosił oTIMESTAMP
...EUREKA !!!
Dla wszystkich, którzy stracili serce, próbując ustawić domyślną wartość DATETIME w MySQL , wiem dokładnie, jak się czujesz / czujesz. Oto on:
Uważnie obserwuj, że nie dodałem pojedynczych cudzysłowów / podwójnych cudzysłowów wokół zera .
Ważna aktualizacja :
Ta odpowiedź została opublikowana dawno temu. Wtedy to działało na mojej (prawdopodobnie najnowszej) instalacji MySQL i miałem ochotę go udostępnić. Przeczytaj poniższe komentarze, zanim zdecydujesz się na skorzystanie z tego rozwiązania.
źródło
Dokumenty mysql 5.6 mówią, że CURRENT_TIMESTAMP może być domyślnie używany zarówno dla typów danych TIMESTAMP, jak i DATETIME:
http://dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html
źródło
W wersjach mysql 5.6.5 i nowszych można używać dokładnych czasów danych oraz ustawiać wartości domyślne. Jest jednak subtelny bit, który polega na przekazaniu wartości dokładności zarówno do wywołania funkcji datetime, jak i NOW ().
Ten przykład działa:
Ten przykład nie działa:
źródło
Może służyć do aktualizacji sygnatury czasowej podczas aktualizacji.
źródło
Najlepszym sposobem jest użycie „DEFAULT 0”. Inny sposób:
źródło
Działa to dla mnie przy użyciu MySQL:
źródło
Wreszcie, to zadziałało dla mnie!
źródło
źródło
Nie jestem pewien, czy to jest nadal aktywne, ale proszę.
Jeśli chodzi o ustawienie wartości domyślnych na Now (), nie widzę, aby było to możliwe dla typu danych DATETIME. Jeśli chcesz użyć tego typu danych, ustaw datę wykonania wstawiania w następujący sposób:
Moja wersja mySQL to 5.5
źródło
INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', NOW())
To działało dla mnie - właśnie zmieniłem INSERT na UPDATE dla mojego stołu.
źródło