Jak ustawić wartość domyślną dla kolumny MySQL Datetime?
W SQL Server to jest getdate()
. Jaki jest odpowiednik MySQL? Używam MySQL 5.x, jeśli to jest czynnik.
Jak ustawić wartość domyślną dla kolumny MySQL Datetime?
W SQL Server to jest getdate()
. Jaki jest odpowiednik MySQL? Używam MySQL 5.x, jeśli to jest czynnik.
Odpowiedzi:
WAŻNA EDYCJA: Teraz można to osiągnąć za pomocą pól DATETIME od MySQL 5.6.5 , spójrz na inny post poniżej ...
Poprzednie wersje nie mogły tego zrobić z DATETIME ...
Ale możesz to zrobić za pomocą TIMESTAMP:
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>
** CAVEAT: JEŚLI zdefiniujesz kolumnę z CURRENT_TIMESTAMP ON jako domyślną, ZAWSZE musisz podać wartość dla tej kolumny lub wartość automatycznie zresetuje się do „teraz ()” podczas aktualizacji. Oznacza to, że jeśli nie chcesz, aby wartość się zmieniała, twoja instrukcja UPDATE musi zawierać „[twoja nazwa kolumny] = [twoja nazwa kolumny]” (lub jakąś inną wartość), inaczej wartość zmieni się w „teraz ()”. Dziwne, ale prawdziwe. Mam nadzieję, że to pomoże. Używam 5.5.56-MariaDB **
DATE
kolumny? (nie datetime
kolumna).
W wersji 5.6.5 możliwe jest ustawienie wartości domyślnej w kolumnie daty i godziny, a nawet utworzenie kolumny, 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
dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
MySQL ( przed wersją 5.6.5 ) nie pozwala na używanie funkcji dla domyślnych wartości DateTime. TIMESTAMP nie jest odpowiedni ze względu na swoje dziwne zachowanie i nie jest zalecany do stosowania jako danych wejściowych. (Zobacz Domyślne typy danych MySQL .)
To powiedziawszy, możesz to zrobić , tworząc Trigger .
Mam tabelę z polem DateCreated typu DateTime. Utworzyłem wyzwalacz na tym stole „Przed wstawieniem” i „ SET NEW.DateCreated=NOW()
” i działa świetnie.
Mam nadzieję, że to komuś pomoże.
IF NEW.created_at IS NOT NULL
Dla mnie podejście wyzwalające działało najlepiej, ale znalazłem problem z podejściem. Rozważ podstawowy wyzwalacz, aby ustawić pole daty na bieżącą godzinę przy wstawianiu:
CREATE TRIGGER myTable_OnInsert BEFORE INSERT ON `tblMyTable`
FOR EACH ROW SET NEW.dateAdded = NOW();
Jest to zwykle świetne, ale powiedz, że chcesz ustawić pole ręcznie za pomocą instrukcji INSERT, na przykład:
INSERT INTO tblMyTable(name, dateAdded) VALUES('Alice', '2010-01-03 04:30:43');
To, co się dzieje, polega na tym, że wyzwalacz natychmiast zastępuje podaną wartość dla pola, a zatem jedynym sposobem na ustawienie czasu nieaktualnego jest następująca instrukcja UPDATE - fuj! Aby zastąpić to zachowanie po podaniu wartości, wypróbuj ten nieco zmodyfikowany wyzwalacz z operatorem 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ść dla swojej kolumny daty, która zajmie, w przeciwnym razie domyślnie przyjmie bieżącą godzinę. To wciąż getto w stosunku do czegoś czystego, takiego jak DEFAULT GETDATE () w definicji tabeli, ale zbliżamy się!
NULL
. Żadnych ostrzeżeń.
dateAdded
spowoduje wyświetlenie wszystkich „0000-00-00 00:00:00”. Korzystanie z tego robi sztuczkę: `DLA KAŻDEJ WIERSZY JEŚLI NEW.dateAdded = 0 TO NASTĘPNIE NEW.dateAdded = NOW (); KONIEC JEŻELI; `
Udało mi się to rozwiązać za pomocą tej instrukcji alter w mojej tabeli, która miała dwa pola daty i godziny.
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ć od funkcji now (). Wstawienie wartości null lub zignorowanie pól create_dt i updated_dt daje idealną wartość znacznika czasu w obu polach. Każda aktualizacja wiersza zmienia wartość updated_dt. Jeśli wstawisz rekordy za pomocą przeglądarki zapytań MySQL, potrzebujesz jeszcze jednego kroku, wyzwalacza do obsługi utworzonego_dt z nowym znacznikiem czasu.
CREATE TRIGGER trig_test_table_insert BEFORE INSERT ON `test_table`
FOR EACH ROW SET NEW.created_dt = NOW();
Wyzwalaczem może być cokolwiek chcesz. Po prostu podoba mi się konwencja nazewnictwa [trig] _ [moja_tabela_nazwa] _ [wstaw]
Możesz użyć wyzwalaczy do zrobienia 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;
Dla wszystkich, którzy stracili serce, próbując ustawić domyślną wartość DATETIME w MySQL , wiem dokładnie, jak się czujesz / czujesz. Oto więc:
ALTER TABLE `table_name` CHANGE `column_name` DATETIME NOT NULL DEFAULT 0
Uważnie obserwuj, że nie dodałem pojedynczych cudzysłowów / podwójnych cudzysłowów wokół zera
Skaczę dosłownie po rozwiązaniu tego: D
ALTER TABLE zones MODIFY created datetime NOT NULL DEFAULT 0;
MySQL 5.6 naprawił ten problem .
ALTER TABLE mytable CHANGE mydate datetime NOT NULL DEFAULT 'CURRENT_TIMESTAMP'
Jeśli już utworzyłeś tabelę, możesz jej użyć
Aby zmienić wartość domyślną na bieżącą datę i godzinę
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';
to rzeczywiście okropne wieści. oto długo oczekiwane żądanie błędu / funkcji w tym celu . ta dyskusja mówi także o ograniczeniach typu danych znacznika czasu.
Zastanawiam się poważnie, na czym polega problem z wdrożeniem tej rzeczy.
Używam MySql Server 5.7.11 i tego zdania:
ALTER TABLE table_name CHANGE date_column datetime NOT NULL DEFAULT '0000-00-00 00:00:00'
to 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 wspomina się w dokumentach mysql :
Typ DATA jest używany dla wartości z częścią daty, ale bez części godziny. MySQL pobiera i wyświetla wartości DATE w formacie „RRRR-MM-DD”. Obsługiwany zakres to „1000-01-01” do „9999-12-31”.
nawet jeśli mówią również:
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”).
Możesz użyć now (), aby ustawić wartość kolumny datetime, ale pamiętaj, że nie możesz użyć tej wartości jako wartości domyślnej.
NOW()
i użyj jej później do wstawienia. W wersji 5.6 po prostu ustaw NOW()
jako wartość domyślną.
Dla wszystkich, którzy używają kolumny TIMESTAMP jako rozwiązania, chcę poprzeć następujące ograniczenie z instrukcji:
http://dev.mysql.com/doc/refman/5.0/en/datetime.html
„Typ danych TIMESTAMP ma zakres od„ 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 SQL tryb, w którym działa serwer. Te właściwości są opisane w dalszej części tej sekcji. ”
To oczywiście zepsuje twoje oprogramowanie za około 28 lat.
Uważam, że jedynym rozwiązaniem po stronie bazy danych jest użycie wyzwalaczy, jak wspomniano w innych odpowiedziach.
Podczas definiowania wyzwalaczy wieloliniowych należy zmienić separator, ponieważ średnik będzie brany przez kompilator MySQL jako koniec wyzwalacza i generuje błąd. na przykład
DELIMITER //
CREATE TRIGGER `MyTable_UPDATE` BEFORE UPDATE ON `MyTable`
FOR EACH ROW BEGIN
-- Set the udpate date
Set new.UpdateDate = now();
END//
DELIMITER ;
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 wpisać nazwę kolumny dwa razy.
Jeśli próbujesz ustawić wartość domyślną jako NOW (), nie sądzę, że MySQL to obsługuje. W MySQL nie można używać 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 określić CURRENT_TIMESTAMP jako domyślną.
Myślę, że jest to proste w mysql, ponieważ mysql to wbudowana funkcja o nazwie now (), która podaje aktualny czas (czas wstawienia).
Twoje zapytanie powinno więc wyglądać podobnie
CREATE TABLE defaultforTime(
`creation_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
`modification_time` DATETIME default now()
);
Dziękuję Ci.
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 „tabeli testowej” użyłem „1999-12-12 12:12:12” jako wartości domyślnej dla kolumny DATETIME colname
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 ;
Jeśli próbujesz ustawić wartość domyślną jako NOW (), MySQL obsługuje, że musisz zmienić typ tej kolumny TIMESTAMP zamiast DATETIME. TIMESTAMP ma domyślnie bieżącą datę i godzinę. Myślę, że to rozwiąże problem ..
Weźmy na przykład, jeśli miałbym tabelę o nazwie „site” z kolumną create_at i kolumną update_at, które były zarówno DATETIME i potrzebują domyślnej wartości teraz, mógłbym wykonać następujący kod 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ść instrukcji jest ważna, ponieważ tabela nie może mieć dwóch kolumn typu TIMESTAMP z domyślnymi wartościami CUREENT TIMESTAMP
To jest 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();
Działa poprawnie z MySQL 8.x
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`dateCreated` datetime DEFAULT CURRENT_TIMESTAMP,
`dateUpdated` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `mobile_UNIQUE` (`mobile`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
Możesz rozwiązać domyślny znacznik czasu. Najpierw zastanów się, którego zestawu znaków używasz, na przykład jeśli użyłeś utf8, ten zestaw znaków obsługuje wszystkie języki, a jeśli wziąłeś laten1, ten zestaw znaków obsługuje tylko angielski. Następnie, jeśli pracujesz nad jakimkolwiek projektem, powinieneś znać strefę czasową klienta i wybrać strefę klienta. Ten krok jest obowiązkowy.