Jak ustawić domyślną wartość kolumny DateTime MySQL?

Jak ustawić domyślną wartość kolumny DateTime MySQL?

W Sql serverze to getdate(). Jaki jest odpowiednik MySQL? Używam MySQL 5.x jeśli jest to czynnik.

Author: Moppo, 2008-10-04

24 answers

WAŻNA EDYCJA: Teraz Można to osiągnąć z polami DATETIME od MySQL 5.6.5, spójrz na inny post poniżej...

Poprzednie wersje nie mogą tego zrobić z DATETIME...

Ale możesz to zrobić ze znacznikiem czasu:

mysql> create table test (str varchar(32), ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
Query OK, 0 rows affected (0.00 sec)

mysql> desc test;
+-------+-------------+------+-----+-------------------+-------+
| Field | Type        | Null | Key | Default           | Extra |
+-------+-------------+------+-----+-------------------+-------+
| str   | varchar(32) | YES  |     | NULL              |       | 
| ts    | timestamp   | NO   |     | CURRENT_TIMESTAMP |       | 
+-------+-------------+------+-----+-------------------+-------+
2 rows in set (0.00 sec)

mysql> insert into test (str) values ("demo");
Query OK, 1 row affected (0.00 sec)

mysql> select * from test;
+------+---------------------+
| str  | ts                  |
+------+---------------------+
| demo | 2008-10-03 22:59:52 | 
+------+---------------------+
1 row in set (0.00 sec)

mysql>

**zastrzeżenie: jeśli zdefiniujesz kolumnę z domyślnie włączonym CURRENT_TIMESTAMP, zawsze będziesz musiał podać wartość dla tej kolumny lub wartość zostanie automatycznie zresetowana na "now ()" podczas aktualizacji. Oznacza to że jeśli nie chcesz, aby wartość się zmieniała, instrukcja UPDATE musi zawierać "[your column name] = [your column name]" (lub jakąś inną wartość) lub wartość stanie się "now()". Dziwne, ale prawdziwe. Mam nadzieję, że to pomoże. Używam 5.5.56-MariaDB * *

 766
Author: sebthebert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-10 19:15:04

W wersji 5.6.5 można ustawić domyślną wartość w kolumnie datetime, a nawet utworzyć kolumnę, która będzie aktualizowana po aktualizacji wiersza. Definicja typu:

CREATE TABLE foo (
    `creation_time`     DATETIME DEFAULT CURRENT_TIMESTAMP,
    `modification_time` DATETIME ON UPDATE CURRENT_TIMESTAMP
)

Odniesienie: http://optimize-this.blogspot.com/2012/04/datetime-default-now-finally-available.html

 499
Author: Gustav Bertram,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-06 14:58:27

MySQL (Przed wersją 5.6.5) nie pozwala na używanie funkcji dla domyślnych wartości DateTime. Znacznik czasu nie jest odpowiedni ze względu na dziwne zachowanie i nie jest zalecany do użycia jako dane wejściowe. (Zobacz Domyślne Typy Danych MySQL.)

To powiedziawszy, możesz to osiągnąć , tworząc WYZWALACZ .

Mam tabelę z polem DateCreated typu DateTime. Stworzyłem WYZWALACZ na tej tabeli "Before Insert" i "SET NEW.DateCreated=NOW() " i działa świetnie.

I hope to komuś pomaga.

 136
Author: Stephan Unrau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-21 20:34:58

Dla mnie podejście trigger zadziałało najlepiej, ale znalazłem problem z podejściem. Rozważ podstawowy WYZWALACZ, aby ustawić pole daty na bieżący czas w insert:

CREATE TRIGGER myTable_OnInsert BEFORE INSERT ON `tblMyTable`
    FOR EACH ROW SET NEW.dateAdded = NOW();

Zazwyczaj jest to świetne, ale powiedzmy, że chcesz ustawić pole ręcznie za pomocą instrukcji INSERT, tak:

INSERT INTO tblMyTable(name, dateAdded) VALUES('Alice', '2010-01-03 04:30:43');

Dzieje się tak, że wyzwalacz natychmiast nadpisuje podaną wartość dla pola, więc jedynym sposobem na ustawienie czasu niestandardowego jest następująca instrukcja aktualizacji -- Fuj! Aby obejść to zachowanie, gdy podano wartość, spróbuj tego nieco zmodyfikowanego wyzwalacza za pomocą operatora IFNULL:

CREATE TRIGGER myTable_OnInsert BEFORE INSERT ON `tblMyTable`
    FOR EACH ROW SET NEW.dateAdded = IFNULL(NEW.dateAdded, NOW());

To daje to, co najlepsze z obu światów: możesz podać wartość kolumny daty i to zajmie, a w przeciwnym razie będzie domyślna dla bieżącego czasu. Nadal jest to getto w stosunku do czegoś czystego jak domyślna GETDATE () w definicji tabeli, ale jesteśmy coraz bliżej!

 127
Author: John Larson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-20 14:12:21

Udało mi się to rozwiązać za pomocą tej instrukcji alter na mojej tabeli, która miała dwa pola datetime.

ALTER TABLE `test_table`
  CHANGE COLUMN `created_dt` `created_dt` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
  CHANGE COLUMN `updated_dt` `updated_dt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

Działa to tak, jak można oczekiwać, że funkcja now() będzie działać. Wstawianie wartości NULL lub ignorowanie pól created_dt i updated_dt powoduje uzyskanie idealnej wartości znacznika czasu w obu polach. Każda aktualizacja wiersza zmienia wartość updated_dt. Jeśli wstawiasz rekordy za pomocą przeglądarki zapytań MySQL, potrzebujesz jeszcze jednego kroku, wyzwalacza do obsługi created_dt z nowym znacznikiem czasu.

CREATE TRIGGER trig_test_table_insert BEFORE INSERT ON `test_table`
    FOR EACH ROW SET NEW.created_dt = NOW();

The trigger może być cokolwiek chcesz po prostu lubię konwencję nazewnictwa [trig]_[my_table_name]_[insert]

 23
Author: 2 revs, 2 users 74%user188217,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-28 20:53:44

Możesz używać wyzwalaczy do tego typu rzeczy.

CREATE TABLE `MyTable` (
`MyTable_ID`  int UNSIGNED NOT NULL AUTO_INCREMENT ,
`MyData`  varchar(10) NOT NULL ,
`CreationDate`  datetime NULL ,
`UpdateDate`  datetime NULL ,
PRIMARY KEY (`MyTable_ID`)
)
;

CREATE TRIGGER `MyTable_INSERT` BEFORE INSERT ON `MyTable`
FOR EACH ROW BEGIN
        -- Set the creation date
    SET new.CreationDate = now();

        -- Set the udpate date
    Set new.UpdateDate = now();
END;

CREATE TRIGGER `MyTable_UPDATE` BEFORE UPDATE ON `MyTable`
FOR EACH ROW BEGIN
        -- Set the udpate date
    Set new.UpdateDate = now();
END;
 22
Author: Donald,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-12 21:02:44

Dla wszystkich tych, którzy stracili serce próbując ustawić domyślną wartośćDATETIME WMySQL , wiem dokładnie, jak się czujesz/czujesz. Oto jest:

ALTER TABLE  `table_name` CHANGE `column_name` DATETIME NOT NULL DEFAULT 0

Uważnie obserwuj, że nie dodałem pojedynczych cytatów / podwójnych cytatów wokół 0

Dosłownie skaczę po rozwiązaniu tego :d

 13
Author: Augiwan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-26 11:36:04

To rzeczywiście straszna wiadomość.oto długo oczekiwany błąd / żądanie funkcji dla tego . dyskusja ta mówi również o ograniczeniach typu danych znacznika czasu.

Naprawdę zastanawiam się, jaki jest problem z wdrożeniem tego czegoś.

 12
Author: Kinjal Dixit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-10 18:38:48

MySQL 5.6 naprawił ten problem .

ALTER TABLE mytable CHANGE mydate datetime NOT NULL DEFAULT 'CURRENT_TIMESTAMP'
 12
Author: Steven Lloyd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-18 18:44:32

Jeśli już stworzyłeś tabelę, możesz użyć

Aby zmienić wartość domyślną na bieżącą datę czas

ALTER TABLE <TABLE_NAME> 
CHANGE COLUMN <COLUMN_NAME> <COLUMN_NAME> DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;

Aby zmienić wartość domyślną na '2015-05-11 13:01:01'

ALTER TABLE <TABLE_NAME> 
CHANGE COLUMN <COLUMN_NAME> <COLUMN_NAME> DATETIME NOT NULL DEFAULT '2015-05-11 13:01:01';
 8
Author: Saveendra Ekanayake,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-07 14:31:20

Dla wszystkich, którzy używają kolumny TIMESTAMP jako rozwiązania Chcę drugie następujące ograniczenie z podręcznika:

Http://dev.mysql.com/doc/refman/5.0/en/datetime.html

" typ danych TIMESTAMP ma zakres '1970-01-01 00: 00: 01' UTC do '2038-01-19 03:14:07' UTC. Ma różne właściwości, w zależności od wersji MySQL i trybu SQL, w którym serwer jest uruchomiony. Właściwości te zostały opisane w dalszej części tej sekcji. "

Więc będzie to oczywiście złamać oprogramowanie w około 28 lat.

Uważam, że jedynym rozwiązaniem Po Stronie bazy danych jest użycie wyzwalaczy, jak wspomniano w innych odpowiedziach.

 7
Author: Fabian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-06 10:13:48

Możesz użyć now (), aby ustawić wartość kolumny datetime, ale pamiętaj, że nie możesz jej użyć jako wartości domyślnej.

 6
Author: KernelM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-03 20:30:13

Podczas definiowania wyzwalaczy wielowierszowych należy zmienić ogranicznik, ponieważ średnik zostanie odebrany przez kompilator MySQL jako koniec wyzwalacza i wygeneruje błąd. np.

DELIMITER //
CREATE TRIGGER `MyTable_UPDATE` BEFORE UPDATE ON `MyTable`
FOR EACH ROW BEGIN
        -- Set the udpate date
    Set new.UpdateDate = now();
END//
DELIMITER ;
 6
Author: Drawin Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-25 08:28:09

Uruchamiam serwer MySql 5.7.11 i to zdanie:

ALTER TABLE table_name CHANGE date_column datetime NOT NULL DEFAULT '0000-00-00 00:00:00'

Jest Nie działa. Ale następujące:

ALTER TABLE table_name CHANGE date_column datetime NOT NULL DEFAULT '1000-01-01 00:00:00'

Po prostu działa .

Jako sidenote , jest wymieniony w docs mysql :

Typ DATE jest używany dla wartości z częścią daty, ale bez części czasu. MySQL pobiera i wyświetla wartości daty w formacie 'RRRR-MM-DD'. Obsługiwany zakres to "1000-01-01" do "9999-12-31".

Nawet jeśli również powiedz:

Nieprawidłowe wartości DATE, DATETIME lub TIMESTAMP są konwertowane na wartość" zero " odpowiedniego typu ('0000-00-00' lub '0000-00-00 00:00:00').

 6
Author: Evhz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-18 14:24:36

Chociaż nie możesz tego zrobić za pomocą DATETIME w domyślnej definicji, możesz po prostu włączyć instrukcję select do instrukcji insert w następujący sposób:

INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))

Zwróć uwagę na brak cudzysłowów wokół tabeli.

Dla MySQL 5.5

 5
Author: George,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-14 09:02:22

Oto Jak to zrobić na MySQL 5.1:

ALTER TABLE `table_name` CHANGE `column_name` `column_name` 
TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;

Nie mam pojęcia, dlaczego musisz dwukrotnie wpisać nazwę kolumny.

 4
Author: Samuel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-14 08:58:49

Jeśli próbujesz ustawić domyślną wartość jako NOW (), myślę, że MySQL tego nie obsługuje. W MySQL nie można użyć funkcji ani wyrażenia jako wartości domyślnej dla dowolnego typu kolumny, z wyjątkiem kolumny typu danych TIMESTAMP, dla której można ustawić CURRENT_TIMESTAMP jako wartość domyślną.

 3
Author: Vijesh VP,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-03 20:31:25
CREATE TABLE `testtable` (
    `id` INT(10) NULL DEFAULT NULL,
    `colname` DATETIME NULL DEFAULT '1999-12-12 12:12:12'
)

W powyższym zapytaniu do utworzenia' testtable 'użyłem' 1999-12-12 12: 12: 12 ' jako domyślnej wartości kolumny DATETIME colname

 2
Author: Fathah Rehman P,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-12 12:39:46

Użyj następującego kodu

DELIMITER $$

    CREATE TRIGGER bu_table1_each BEFORE UPDATE ON table1 FOR EACH ROW
    BEGIN
      SET new.datefield = NOW();
    END $$

    DELIMITER ;
 2
Author: Rana Aalamgeer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-19 10:46:32

Jeśli próbujesz ustawić domyślną wartość jako NOW(),MySQL obsługuje, że musisz zmienić typ znacznika czasu kolumny zamiast DATETIME. Znacznik czasu domyślnie zawiera bieżącą datę i godzinę..myślę, że to rozwiąże twój problem..

 0
Author: Dhrumil Shah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-16 06:10:46

Weźmy na przykład tabelę o nazwie 'site' z created_at i kolumną update_at, które były zarówno DATETIME, jak i wymagają domyślnej wartości now, mógłbym wykonać następujący sql, aby to osiągnąć.

ALTER TABLE `site` CHANGE `created_at` `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;

ALTER TABLE `site` CHANGE `created_at` `created_at` DATETIME  NULL DEFAULT NULL;

ALTER TABLE `site` CHANGE `updated_at` `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;

ALTER TABLE `site` CHANGE `updated_at` `updated_at` DATETIME NULL DEFAULT  NULL;

Kolejność poleceń jest ważna, ponieważ tabela nie może mieć dwóch kolumn typu TIMESTAMP z domyślnymi wartościami CUREENT TIMESTAMP

 0
Author: Joseph Persie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-09 00:13:13

Oto mój przykład wyzwalacza:

/************ ROLE ************/
drop table if exists `role`;
create table `role` (
    `id_role` bigint(20) unsigned not null auto_increment,
    `date_created` datetime,
    `date_deleted` datetime,
    `name` varchar(35) not null,
    `description` text,
    primary key (`id_role`)
) comment='';

drop trigger if exists `role_date_created`;
create trigger `role_date_created` before insert
    on `role`
    for each row 
    set new.`date_created` = now();
 0
Author: Lucas Moyano Angelini,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-19 13:29:11

Myślę, że to proste w mysql od mysql wbudowana funkcja o nazwie now (), która daje bieżący czas (Czas tej wkładki).

Więc twoje zapytanie powinno wyglądać podobnie

CREATE TABLE defaultforTime(
    `creation_time`     DATETIME DEFAULT CURRENT_TIMESTAMP,
    `modification_time` DATETIME default now()
);
Dziękuję.
 0
Author: Deepak N,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-26 08:07:18

Możesz rozwiązać domyślny znacznik czasu. Najpierw rozważ, którego zestawu znaków używasz na przykład, jeśli u wzięty utf8 ten zestaw znaków obsługuje wszystkie języki, a jeśli u wzięty laten1 ten zestaw znaków obsługuje tylko angielski. Następny setp jeśli pracujesz w dowolnym projekcie powinieneś znać strefę czasową klienta i wybrać jesteś strefą klienta. Ten krok jest obowiązkowy.

 -2
Author: Srinivas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-28 12:05:50