2010-08-15 71 views
9

Tôi đang tạo một số bảng nơi tôi muốn lưu trữ thời gian khi một bản ghi được tạo và khi nó được cập nhật lần cuối. Tôi nghĩ rằng tôi có thể có hai trường dấu thời gian trong đó một trường sẽ có giá trị CURRENT_TIMESTAMP và trường còn lại sẽ có CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP. Nhưng tôi đoán tôi không thể làm điều này bởi vì bạn chỉ có thể có 1 trường dấu thời gian với một giá trị mặc định trong một bảng?MySQL tạo thời gian và thời gian cập nhật dấu thời gian

Bạn khuyên tôi nên nhận và lưu trữ hai lần như thế nào? Cảm ơn!

Trả lời

8

Bạn có thể có hai cột loại dấu thời gian trong một bảng.

Các công trình sau đây cho MySQL 5,0

 
create table t 
(
    id integer, 
    created_at timestamp default current_timestamp, 
    updated_at timestamp 
); 

Tôi nghĩ rằng bạn đang nhầm lẫn điều này với SQL Server (nơi timestamp là không thực sự là một "tem thời gian" và có thực sự là một giới hạn trên một cột "timestamp" duy nhất)

Chỉnh sửa: Nhưng bạn sẽ cần trình kích hoạt để cập nhật cột update_at mỗi khi hàng được thay đổi.

+0

Đó là chính xác, dấu thời gian của SQL Server thực sự chỉ là một từ đồng nghĩa với rowversion – SQLMenace

+0

Điều này sẽ thực thi, nhưng trường updated_at không được tự động sửa đổi khi thay đổi. Tôi nghĩ rằng việc thêm ON UPDATE CURRENT_TIMESTAMP vào cột updated_at sẽ quan tâm đến điều đó. Đó là khi nó phàn nàn rằng điều này không thể được thực hiện. – Aishwar

+0

Có, như tôi đã nói: bạn cần sử dụng trình kích hoạt để điền cột updated_at –

2

Theo như tôi biết, không có giải pháp nào cho hạn chế đó. Bạn sẽ cần phải đặt thủ công (ít nhất) một trong các dấu thời gian, cách dễ nhất là chỉ cần thêm updated = NOW() vào số UPDATE -query.

+0

1 Điều đó dường như là một giải pháp khả thi. Tôi đã thực sự yêu nó, nếu máy chủ có thể làm điều đó tự động :) – Aishwar

+0

Có thể có thể với kích hoạt mặc dù, nhưng tôi nghĩ rằng đó không phải là một giải pháp tuyệt vời. –

+0

Thông thường nó được thực hiện ngược lại: bạn tự xác định 'created = NOW()' và 'updated' được đặt tự động.Lý do là bạn tạo bản ghi 1 lần nhưng bản cập nhật có thể không giới hạn. – Stalinko

0

Bạn sẽ cần hai cột: CREATE_TIME và UPDATE_TIME.

Bạn có thể muốn thêm CREATE_USER và UPDATE_USER.

Có lẽ bạn muốn có mối quan hệ 1: nhiều với tên cột thay đổi, giá trị cũ và mới.

Đó là tất cả các phần của việc thu thập dữ liệu thay đổi. Bạn có thể có các bảng CDC được cập nhật bằng trình kích hoạt.

+0

Tôi có 2 cột để lưu trữ thời gian tạo và thời gian cập nhật - nhưng tôi không thể đặt hai giá trị mặc định mà tôi đã nêu ở trên. Tôi sẽ xem xét CDC là gì. Không nên có một giải pháp đơn giản cho điều này? Tôi muốn hình ảnh này là một kịch bản phổ biến. – Aishwar

+0

Nó là phổ biến, nhưng tôi không tin rằng MySQL có một giải pháp tích hợp cho nó. Oracle và SQL Server làm. Không nên khó làm: một vài bảng và trình kích hoạt. – duffymo

0

Tôi sẽ để lại dấu thời gian hiện tại theo cách bạn đề xuất và điền vào trường created_at với ngày hiện tại khi chèn.

14

Một cách tốt để tạo ra các lĩnh vực như 'tạo ra' và 'cập nhật' là

CREATE TABLE `mytable` ( 
`id` INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, 
`created` TIMESTAMP DEFAULT '0000-00-00 00:00:00', 
`updated` TIMESTAMP DEFAULT now() ON UPDATE now(), 
`myfield` VARCHAR(255) 
); 

Và cần thiết của nó để nhập null vào cả hai cột trong "chèn":

INSERT INTO mytable (created,updated,myfield) VALUES (null,null,'blablabla'); 

Và bây giờ, trong tất cả các cập nhật, trường 'được cập nhật' sẽ có một giá trị mới với ngày thực tế.

UPDATE mytable SET myfield='blablablablu' WHERE myfield='blablabla'; 

Nguồn: http://gusiev.com/2009/04/update-and-create-timestamps-with-mysql/

+2

Đây là giải pháp tốt nhất mà tôi đã tìm thấy. Sự kỳ diệu là NULL được dịch sang NOW() trên chèn. Trong một ứng dụng điển hình, sẽ có nhiều cách để cập nhật một hàng hơn là tạo nó, vì vậy điều này cảm thấy ít bảo trì hơn là sử dụng "một giờ" của bạn khi tạo và xử lý thủ công các bản cập nhật, sử dụng trình kích hoạt riêng hoặc cách tiếp cận khác. – botimer

+1

Đã làm việc tuyệt vời! Mặc dù trong tình huống của tôi tôi dường như không cần phải vượt qua các giá trị null và chỉ cần cột cập nhật thay đổi. Dường như hoạt động tốt. 'created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,' ... – Jordan

7

Tính đến MYSQL phiên bản 5.6.5 bạn có thể làm điều này bằng DEFAULT và ON UPDATE. Không cần kích hoạt.

ts_create dấu thời gian DEFAULT CURRENT_TIMESTAMP, ts_update dấu thời gian DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

+0

Ngay bây giờ đây là câu trả lời hay nhất! – v010dya

Các vấn đề liên quan