Làm thế nào để bạn đặt một giá trị mặc định cho cột Thời gian của MySQL?
Trong SQL Server, nó getdate()
. Tương đương với MySQL là gì? Tôi đang sử dụng MySQL 5.x nếu đó là một yếu tố.
Làm thế nào để bạn đặt một giá trị mặc định cho cột Thời gian của MySQL?
Trong SQL Server, nó getdate()
. Tương đương với MySQL là gì? Tôi đang sử dụng MySQL 5.x nếu đó là một yếu tố.
Câu trả lời:
EDIT QUAN TRỌNG: Hiện tại có thể đạt được điều này với các trường DATETIME kể từ MySQL 5.6.5 , hãy xem bài đăng khác bên dưới ...
Các phiên bản trước không thể làm điều đó với DATETIME ...
Nhưng bạn có thể làm điều đó với 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: NẾU bạn xác định một cột với CURRENT_TIMESTAMP BẬT làm mặc định, bạn sẽ cần LUÔN xác định một giá trị cho cột này hoặc giá trị sẽ tự động đặt lại thành "now ()" khi cập nhật. Điều này có nghĩa là nếu bạn không muốn giá trị thay đổi, câu lệnh CẬP NHẬT của bạn phải chứa "[tên cột của bạn] = [tên cột của bạn]" (hoặc một số giá trị khác) hoặc giá trị sẽ trở thành "now ()". Lạ, nhưng đúng. Tôi hi vọng cái này giúp được. Tôi đang sử dụng 5.5.56-MariaDB **
DATE
cột không? (không phải là một datetime
cột).
Trong phiên bản 5.6.5, có thể đặt giá trị mặc định trên cột datetime và thậm chí tạo một cột sẽ cập nhật khi hàng được cập nhật. Định nghĩa loại:
CREATE TABLE foo (
`creation_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
`modification_time` DATETIME ON UPDATE CURRENT_TIMESTAMP
)
Tham khảo: http://optizes-this.blogspot.com/2012/04/datetime-default-now-finally-av Available.html
dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
MySQL ( trước phiên bản 5.6.5 ) không cho phép các chức năng được sử dụng cho các giá trị DateTime mặc định. TIMESTAMP không phù hợp do hành vi kỳ quặc của nó và không được khuyến nghị sử dụng làm dữ liệu đầu vào. (Xem Mặc định loại dữ liệu MySQL .)
Điều đó nói rằng, bạn có thể thực hiện điều này bằng cách tạo Kích hoạt .
Tôi có một bảng với trường DateCreated thuộc loại DateTime. Tôi đã tạo một kích hoạt trên bảng đó "Trước khi chèn" và " SET NEW.DateCreated=NOW()
" và nó hoạt động rất tốt.
Tôi hi vọng nó sẽ giúp ích cho mọi người.
IF NEW.created_at IS NOT NULL
Đối với tôi, cách tiếp cận kích hoạt đã làm việc tốt nhất, nhưng tôi đã tìm thấy một nhược điểm với cách tiếp cận này. Xem xét trình kích hoạt cơ bản để đặt trường ngày thành thời gian hiện tại khi chèn:
CREATE TRIGGER myTable_OnInsert BEFORE INSERT ON `tblMyTable`
FOR EACH ROW SET NEW.dateAdded = NOW();
Điều này thường rất hay, nhưng giả sử bạn muốn đặt trường theo cách thủ công thông qua câu lệnh INSERT, như vậy:
INSERT INTO tblMyTable(name, dateAdded) VALUES('Alice', '2010-01-03 04:30:43');
Điều gì xảy ra là trình kích hoạt ngay lập tức ghi đè giá trị được cung cấp của bạn cho trường và vì vậy cách duy nhất để đặt thời gian không hiện tại là câu lệnh CẬP NHẬT tiếp theo - yuck! Để ghi đè hành vi này khi giá trị được cung cấp, hãy thử trình kích hoạt được sửa đổi một chút này với toán tử IFNULL:
CREATE TRIGGER myTable_OnInsert BEFORE INSERT ON `tblMyTable`
FOR EACH ROW SET NEW.dateAdded = IFNULL(NEW.dateAdded, NOW());
Điều này mang lại điều tốt nhất cho cả hai thế giới: bạn có thể cung cấp một giá trị cho cột ngày của bạn và nó sẽ mất, và nếu không, nó sẽ mặc định theo thời gian hiện tại. Nó vẫn còn ghetto liên quan đến một cái gì đó sạch như DEFAULT GETDATE () trong định nghĩa bảng, nhưng chúng ta đang tiến gần hơn!
NULL
. Không có cảnh báo nữa.
dateAdded
sẽ hiển thị tất cả '0000-00-00 00:00:00'. Sử dụng điều này thực hiện mẹo: `CHO MACHI ROW NẾU NEW.dateAdded = 0 THEN SET NEW.dateAdded = NOW (); HẾT NẾU; `
Tôi đã có thể giải quyết điều này bằng cách sử dụng câu lệnh thay đổi này trên bảng có hai trường 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;
Điều này hoạt động như bạn mong đợi hàm now () hoạt động. Chèn null hoặc bỏ qua các trường created_dt và update_dt dẫn đến một giá trị dấu thời gian hoàn hảo trong cả hai trường. Bất kỳ cập nhật nào cho hàng đều thay đổi update_dt. Nếu bạn chèn các bản ghi thông qua trình duyệt truy vấn MySQL, bạn cần thêm một bước nữa, một trình kích hoạt để xử lý created_dt với dấu thời gian mới.
CREATE TRIGGER trig_test_table_insert BEFORE INSERT ON `test_table`
FOR EACH ROW SET NEW.created_dt = NOW();
Trình kích hoạt có thể là bất cứ điều gì bạn muốn Tôi giống như quy ước đặt tên [trig] _ [my_table_name] _ [insert]
Bạn có thể sử dụng kích hoạt để làm loại công cụ này.
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;
Đối với tất cả những người mất lòng khi cố gắng đặt giá trị DATETIME mặc định trong MySQL , tôi biết chính xác cảm giác / cảm nhận của bạn. Vì vậy, đây là:
ALTER TABLE `table_name` CHANGE `column_name` DATETIME NOT NULL DEFAULT 0
Quan sát cẩn thận rằng tôi chưa thêm dấu ngoặc đơn / dấu ngoặc kép quanh 0
Tôi thực sự nhảy sau khi giải quyết điều này: D
ALTER TABLE zones MODIFY created datetime NOT NULL DEFAULT 0;
MySQL 5.6 đã khắc phục vấn đề này .
ALTER TABLE mytable CHANGE mydate datetime NOT NULL DEFAULT 'CURRENT_TIMESTAMP'
Nếu bạn đã tạo bảng rồi thì bạn có thể sử dụng
Để thay đổi giá trị mặc định thành thời gian ngày hiện tại
ALTER TABLE <TABLE_NAME>
CHANGE COLUMN <COLUMN_NAME> <COLUMN_NAME> DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;
Để thay đổi giá trị mặc định thành '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';
Đây thực sự là một tin khủng khiếp. đây là một yêu cầu lỗi / tính năng đang chờ xử lý lâu cho việc này . cuộc thảo luận đó cũng nói về những hạn chế của kiểu dữ liệu dấu thời gian.
Tôi thực sự tự hỏi vấn đề với việc thực hiện điều này là gì.
Tôi đang chạy MySql Server 5.7.11 và câu này:
ALTER TABLE table_name CHANGE date_column datetime NOT NULL DEFAULT '0000-00-00 00:00:00'
là không làm việc. Nhưng như sau:
ALTER TABLE table_name CHANGE date_column datetime NOT NULL DEFAULT '1000-01-01 00:00:00'
chỉ hoạt động .
Là một sidenote , nó được đề cập trong các tài liệu mysql :
Loại DATE được sử dụng cho các giá trị có phần ngày nhưng không có phần thời gian. MySQL truy xuất và hiển thị các giá trị DATE theo định dạng 'YYYY-MM-DD'. Phạm vi được hỗ trợ là '1000-01-01' đến '9999-12-31'.
ngay cả khi họ cũng nói:
Các giá trị DATE, DATETIME hoặc TIMESTAMP không hợp lệ được chuyển đổi thành giá trị zero 0 của loại thích hợp ('0000-00-00' hoặc '0000-00-00 00:00:00').
Bạn có thể sử dụng now () để đặt giá trị của cột datetime, nhưng hãy nhớ rằng bạn không thể sử dụng giá trị đó làm giá trị mặc định.
NOW()
và sử dụng nó sau để chèn. Đối với phiên bản 5.6, chỉ cần đặt NOW()
làm giá trị mặc định.
Đối với tất cả những người sử dụng cột TIMESTAMP như một giải pháp tôi muốn thứ hai giới hạn sau từ hướng dẫn:
http://dev.mysql.com/doc/refman/5.0/en/datetime.html
"Kiểu dữ liệu TIMESTAMP có phạm vi từ '1970-01-01 00:00:01' UTC đến ' 2038-01-19 03:14:07 ' UTC. Nó có các thuộc tính khác nhau, tùy thuộc vào phiên bản MySQL và SQL chế độ máy chủ đang chạy. Các thuộc tính này được mô tả sau trong phần này. "
Vì vậy, điều này rõ ràng sẽ phá vỡ phần mềm của bạn trong khoảng 28 năm.
Tôi tin rằng giải pháp duy nhất về phía cơ sở dữ liệu là sử dụng các kích hoạt như được đề cập trong các câu trả lời khác.
Trong khi xác định các kích hoạt đa dòng, người ta phải thay đổi dấu phân cách vì dấu chấm phẩy sẽ được trình biên dịch MySQL lấy làm kết thúc kích hoạt và tạo ra lỗi. ví dụ
DELIMITER //
CREATE TRIGGER `MyTable_UPDATE` BEFORE UPDATE ON `MyTable`
FOR EACH ROW BEGIN
-- Set the udpate date
Set new.UpdateDate = now();
END//
DELIMITER ;
Đây là cách thực hiện trên MySQL 5.1:
ALTER TABLE `table_name` CHANGE `column_name` `column_name`
TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
Tôi không biết tại sao bạn phải nhập tên cột hai lần.
Nếu bạn đang cố gắng đặt giá trị mặc định là NOW (), tôi không nghĩ MySQL hỗ trợ điều đó. Trong MySQL, bạn không thể sử dụng hàm hoặc biểu thức làm giá trị mặc định cho bất kỳ loại cột nào, ngoại trừ cột loại dữ liệu TIMESTAMP, mà bạn có thể chỉ định CURRENT_TIMESTAMP làm mặc định.
Tôi nghĩ nó đơn giản trong mysql vì mysql hàm inbuilt được gọi là now () cung cấp thời gian hiện tại (thời gian của lần chèn đó).
Vì vậy, truy vấn của bạn sẽ trông giống như
CREATE TABLE defaultforTime(
`creation_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
`modification_time` DATETIME default now()
);
Cảm ơn bạn.
CREATE TABLE `testtable` (
`id` INT(10) NULL DEFAULT NULL,
`colname` DATETIME NULL DEFAULT '1999-12-12 12:12:12'
)
Trong truy vấn trên để tạo 'testtable', tôi đã sử dụng '1999-12-12 12:12:12' làm giá trị mặc định cho cột DATETIME colname
Sử dụng mã sau
DELIMITER $$
CREATE TRIGGER bu_table1_each BEFORE UPDATE ON table1 FOR EACH ROW
BEGIN
SET new.datefield = NOW();
END $$
DELIMITER ;
Nếu bạn đang cố gắng đặt giá trị mặc định là NOW (), MySQL hỗ trợ rằng bạn phải thay đổi loại cột TIMESTAMP thay vì DATETIME. TIMESTAMP có ngày và giờ hiện tại là mặc định..tôi nghĩ rằng nó sẽ giải quyết vấn đề của bạn ..
Ví dụ: Nếu tôi có một bảng có tên là 'trang web' với cột created_at và cột update_at vừa là DATETIME và cần giá trị mặc định bây giờ, tôi có thể thực hiện sql sau để đạt được điều này.
ALTER TABLE `site` THAY ĐỔI` created_at`` created_at` TIMESTAMP KHÔNG NULL DEFAULT CURRENT_TIMESTAMP; ALTER TABLE `site` THAY ĐỔI` created_at`` created_at` DATETIME NULL DEFAULT NULL; ALTER TABLE `site` THAY ĐỔI` update_at`` update_at` TIMESTAMP KHÔNG NULL DEFAULT CURRENT_TIMESTAMP; ALTER TABLE `site` THAY ĐỔI` update_at`` update_at` DATETIME NULL DEFAULT NULL;
Trình tự các câu lệnh rất quan trọng vì một bảng không thể có hai cột kiểu TIMESTAMP với các giá trị mặc định là CUREENT TIMESTAMP
Đây là ví dụ kích hoạt của tôi:
/************ 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();
Hoạt động tốt với 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;
Bạn có thể giải quyết dấu thời gian mặc định. Trước tiên hãy xem xét bộ ký tự nào bạn đang sử dụng, ví dụ nếu bạn lấy utf8, bộ ký tự này hỗ trợ tất cả các ngôn ngữ và nếu bạn lấy laten1 thì bộ ký tự này chỉ hỗ trợ cho tiếng Anh. Setp tiếp theo nếu bạn đang làm việc theo bất kỳ dự án nào, bạn nên biết múi giờ của khách hàng và chọn bạn là vùng khách hàng. Bước này là bắt buộc.