Đặt NOW () làm Giá trị mặc định cho kiểu dữ liệu datetime?


197

Tôi có hai cột trong bảng người dùng registerDate and lastVisitDate, bao gồm kiểu dữ liệu datetime. Tôi muốn làm như sau.

  1. Đặt giá trị mặc định registerDate thành MySQL NOW ()
  2. Đặt giá trị mặc định lastVisitDate thành 0000-00-00 00:00:00Thay vì null mà nó sử dụng theo mặc định.

Vì bảng đã tồn tại và có các bản ghi hiện có, tôi muốn sử dụng bảng Sửa đổi. Tôi đã thử sử dụng hai đoạn mã dưới đây, nhưng không hoạt động.

ALTER TABLE users MODIFY registerDate datetime DEFAULT NOW()
ALTER TABLE users MODIFY registerDate datetime DEFAULT CURRENT_TIMESTAMP;

Nó cho tôi Lỗi: ERROR 1067 (42000): Invalid default value for 'registerDate'

Tôi có thể đặt giá trị datetime mặc định thành NOW () trong MySQL không?


4
ALTER TABLE users MODIFY dateTime timestamp default CURRENT_TIMESTAMP. Bạn đã không xác định data typetrường trong cả hai nỗ lực của mình
Shakti Singh

3
Vì MySQL 5.6 DATEnên hoạt động với giá trị mặc địnhNOW()
AbcAeffchen

Theo tài liệu mysql 5.6 này: dev.mysql.com/doc/refman/5.6/en/data-type-defaults.html , bạn có thể sử dụng CURRENT_TIMESTAMP () làm mặc định.
blacktie24

Tôi sẽ triển khai CURRENT_TIMESTAMP + 1 NGÀY như thế nào
Ilker Baltaci

Câu trả lời:


241

Kể từ MySQL 5.6.5, bạn có thể sử dụng DATETIMEloại có giá trị mặc định động:

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

Hoặc thậm chí kết hợp cả hai quy tắc:

modification_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

Tham khảo:
http://dev.mysql.com/doc/refman/5.7/en/timestamp-initialization.html
http://optizes-this.blogspot.com/2012/04/datetime-default-now-finally-av Available .html

Trước 5.6.5, bạn cần sử dụng TIMESTAMPloại dữ liệu, tự động cập nhật bất cứ khi nào bản ghi được sửa đổi. Thật không may, tuy nhiên, chỉ có một TIMESTAMPtrường cập nhật tự động có thể tồn tại trên mỗi bảng.

CREATE TABLE mytable (
  mydate TIMESTAMP
)

Xem: http://dev.mysql.com/doc/refman/5.1/en/create-table.html

Nếu bạn muốn ngăn MySQL cập nhật giá trị dấu thời gian trên UPDATE(để nó chỉ kích hoạt INSERT), bạn có thể thay đổi định nghĩa thành:

CREATE TABLE mytable (
  mydate TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)

80
tôi thực sự không muốn sử dụng dấu thời gian.
Ibrahim Azhar Armar

2
@Ibrahim: dấu thời gian là cơ hội duy nhất của bạn. Nếu bạn sử dụng trường datetime, bạn phải chèn bản ghi bằng now () mọi lúc.
Nicola Cossu

9
Hướng dẫn sử dụng nói rõ: "Ví dụ, điều này có nghĩa là bạn không thể đặt mặc định cho cột ngày là giá trị của hàm như NOW () hoặc CURRENT_DATE".
Nicola Cossu

19
@Johan DATETIMEthường được ưu tiên thực hiện phạm vi mà nó có thể giữ: '1000-01-01 00:00:00' đến '9999-12-31 23:59:59' so với TIMESTAMPS's' 1970-01-01 00: 00:01 'UTC đến' 2038-01-19 03:14:07 'UTC. Đối với mục đích lưu trữ ngày sinh, hoặc một cái gì đó hơn 30 năm trong tương lai chẳng hạn.
dùng17753

5
@nickrulez Bạn không còn bị hạn chế đối timestampvới hành vi này kể từ MySQL 5.6
Dan Esparza

70

Tôi sử dụng một kích hoạt như một cách giải quyết để đặt trường datetime thành NOW () cho các chèn mới:

CREATE TRIGGER `triggername` BEFORE INSERT ON  `tablename` 
FOR EACH ROW 
SET NEW.datetimefield = NOW()

nó cũng hoạt động để cập nhật

Câu trả lời của Johan & Leonardo liên quan đến việc chuyển đổi sang trường dấu thời gian. Mặc dù điều này có thể ổn đối với trường hợp sử dụng được trình bày trong câu hỏi (lưu trữ RegisterDate và LastVisitDate), nhưng nó không phải là một giải pháp phổ quát. Xem câu hỏi datetime so với dấu thời gian .


4
Đây phải là câu trả lời được chấp nhận, nhưng cụ thể bạn nên chỉnh sửa nó để làm cho nó rõ ràng là dành cho trường datetime. Người đăng ban đầu muốn biết cách giải quyết nó cho trường datetime và use a timestamplà một cách giải quyết ngu ngốc nếu bạn thực sự tìm hiểu sự khác biệt giữa hai loại dữ liệu này.
phpguru

45

Giải pháp của tôi

ALTER TABLE `table_name` MODIFY COLUMN `column_name` TIMESTAMP NOT
NULL DEFAULT CURRENT_TIMESTAMP;

Def này hoạt động, tôi khuyên mọi người nên sử dụng SQLYog hoặc một công cụ như vậy, nó cho phép bạn thực hiện công cụ này trên một giao diện dễ dàng.
Gạch bất biến

27
Đây vẫn là giải pháp cho TIMESTAMPcột. Không ai yêu cầu TIMESTAMP...
Petr Peller

2
Vâng, đây không phải là câu trả lời cho câu hỏi. TIMESTAMP là một loại trường khác với DATETIME.
John Hunt

@Leonardo làm thế nào tôi chỉ có thể hiển thị ngày
151291

13

EUREKA !!!


Đố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 .


Cập nhật quan trọng :

Câu trả lời này đã được đăng lại từ lâu. Trước đó, nó hoạt động trên bản cài đặt MySQL (có lẽ là mới nhất) của tôi và tôi cảm thấy muốn chia sẻ nó. Vui lòng đọc các bình luận bên dưới trước khi bạn quyết định sử dụng giải pháp này ngay bây giờ.


16
Nó phụ thuộc vào sự mong đợi ... - Giải pháp này cho phép bạn có trường KHÔNG NULL, do mặc định được cung cấp. - Giải pháp này sẽ không đặt trường thành NOW ().
CodeReaper

10
Điều này không trả lời câu hỏi ban đầu; Câu trả lời cần nêu rõ.
Matt Browne

2
Xin lưu ý rằng chế độ SQL TRUYỀN THỐNG bao gồm NO_ZERO_DATE, vì vậy, ở trên sẽ không hoạt động trong trường hợp đó.
Móż

Dựa trên các câu trả lời được cung cấp, âm thanh như nếu bạn sẽ không hy sinh DATETIME để là TIMESTAMP, thì bạn phải sử dụng kích hoạt.
Chris

1
Giải pháp này sẽ khiến một số người điên cuồng với "OMG là ngày KHÔNG! Thật là một HERESY! Chúng ta không thể chuyển đổi 'cái này' thành java.lang.Date/System.DateTime! OMG! -Rash-".
Felype


4

Trên các phiên bản mysql 5.6.5 trở lên, bạn có thể sử dụng thời gian chính xác và cũng đặt giá trị mặc định. Mặc dù vậy, có một bit tinh tế, đó là chuyển giá trị chính xác cho cả lệnh gọi hàm datetime và hàm NOW ().

Ví dụ này hoạt động:

    ALTER TABLE my_table MODIFY created datetime(6) NOT NULL DEFAULT NOW(6);

Ví dụ này không hoạt động:

    ALTER TABLE my_table MODIFY created datetime(6) NOT NULL DEFAULT NOW();

1
`ALTER TABLE  `table_name` CHANGE `column_name` 
    timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 
    ON UPDATE CURRENT_TIMESTAMP

Có thể được sử dụng để cập nhật dấu thời gian trên bản cập nhật.


1

Cách tốt nhất là sử dụng "DEFAULT 0". Cách khác:

    /************ 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

Điều này làm việc cho tôi, sử dụng MySQL:

ALTER TABLE `table_name` MODIFY `column_name` datetime NOT NULL DEFAULT NOW();

0
ALTER TABLE table_name
  CHANGE COLUMN date_column_name date_column_name DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;

Cuối cùng, điều này làm việc cho tôi!


0
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;

-1

Không chắc chắn nếu điều này vẫn còn hoạt động nhưng ở đây đi.

Về việc đặt mặc định thành Now (), tôi không thấy điều đó có thể đối với kiểu dữ liệu DATETIME. Nếu bạn muốn sử dụng kiểu dữ liệu đó, hãy đặt ngày khi bạn thực hiện thao tác chèn như thế này:

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

Phiên bản myQuery của tôi là 5.5


7
Có thể được đơn giản hóa như sau:INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', NOW())
user17753

-1

Điều này làm việc cho tôi - chỉ cần thay đổi CHERTN thành CẬP NHẬT cho bảng của tôi.

INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.