Đang cập nhật mục nhập KHÔNG cập nhật dấu thời gian


77

Tôi có dấu thời gian trong bảng mysql với thuộc tính "ON UPDATE CURRENT_TIMESTAMP". Có cách nào để tắt cập nhật dấu thời gian theo cách thủ công vào một dịp đặc biệt không? (ví dụ: cập nhật mục nhập để sửa đổi bài đăng trên blog, nhưng không cập nhật lại bài đăng đó)

Câu trả lời:


47

Có cách nào để tắt cập nhật dấu thời gian theo cách thủ công vào một dịp đặc biệt không? (ví dụ: cập nhật mục nhập để sửa đổi bài đăng trên blog, nhưng không cập nhật lại bài đăng đó)

Có vẻ như bạn cần định cấu hình ràng buộc mặc định để nó chỉ điền vào cột khi chèn:

DEFAULT CURRENT_TIMESTAMP

Thay đổi nó thành chỉ điều này có nghĩa là bất kỳ bản sửa đổi nào sẽ không kích hoạt giá trị dấu thời gian được cập nhật. IE: Nếu bạn đã tạo bài đăng trên blog vào ngày hôm qua và hôm nay đã sửa lỗi đánh máy - thì ngày trong cột sẽ vẫn là ngày hôm qua.


1
Bạn có thể hiển thị một câu lệnh SQL để cập nhật trường cho những người khác không, tôi đã tự tìm ra?
một lập trình viên

Điều gì sẽ xảy ra nếu tôi muốn cập nhật last_updatedtrường (giữ ON UPDATE CURRENT_TIMESTAMPhành vi) như bình thường ngoại trừ trường hợp cập nhật chỉ được thực hiện trên một cột cụ thể ? Trên thực tế, tôi đang lập mô hình một db siêu dữ liệu để lưu giữ thông tin của các crons nhất định ( nguồn, chìm, last_completion_time của chúng ). Vì vậy, tôi các last_updatedlĩnh vực phải được cập nhật chỉ khi cron được thực sự sửa đổi (và không phải khi cron của last_completion_timelĩnh vực đã được cập nhật)
Y2K-Shubham

144

Bạn có thể đặt thủ công giá trị của cột thành giá trị hiện tại của nó trong lệnh cập nhật:

UPDATE table SET x=y, timestampColumn=timestampColumn WHERE a=b;

Nếu bạn không đặt giá trị trong truy vấn, giá trị đó sẽ được cập nhật thành dấu thời gian hiện tại theo định nghĩa bảng.


13
"chậm hơn" - bao nhiêu? Có lâu hơn OP để xóa phép thuật ON UPDATE, thêm NOW()vào tất cả các truy vấn khác và thử lại ứng dụng của mình?
Andy

Chậm hơn bao nhiêu tùy thuộc vào số lượng hàng bạn đang cập nhật. Nếu bạn đang làm việc với nhật ký hệ thống với hàng triệu hàng theo nghĩa đen thì nó không chỉ chậm - nó còn chậm mỗi khi bạn chạy truy vấn đó. Tôi không đề nghị loại bỏ DEFAULTgiá trị; just theON UPDATE
Mikhail

2
Cảm ơn bạn, đây chỉ là những gì tôi cần. Tôi có bảng "blogposts" và khi tôi cập nhật số lượt xem, nó sẽ cập nhật cột "datetime_edited" (trên dấu thời gian cập nhật). Vào mỗi dịp khác, tôi cần cập nhật trường "datetime_edited" - thay đổi tiêu đề hoặc mô tả, tải lên hình ảnh mới, v.v.
fsasvari

2
Tôi ước tôi có thể ủng hộ điều này nhiều hơn một lần! Tôi thậm chí không biết bạn có thể tham chiếu đến một cột trong bản ghi trong một tuyên bố cập nhật! Một thế giới hoàn toàn mới!
samon

Cảm ơn bạn, đây là giải pháp tuyệt vời, chính xác những gì tôi cần. Giới thiệu.
Piotr Stępniewski

24

Để làm cho bảng / dấu thời gian của bạn tự động cập nhật:

ALTER TABLE myTable
CHANGE myTimestampColumn
        myTimestampColumn TIMESTAMP NOT NULL
                       DEFAULT CURRENT_TIMESTAMP 
                       ON UPDATE CURRENT_TIMESTAMP;

Để làm cho nó không tự động cập nhật:

ALTER TABLE myTable
CHANGE myTimestampColumn
        myTimestampColumn TIMESTAMP NOT NULL
                       DEFAULT CURRENT_TIMESTAMP;

LƯU Ý: Phần "default current_timestamp" chỉ đặt nó thành tem hiện tại tại thời điểm mặc định, vì trường không phải là rỗng. Bạn có thể xóa cả không null và mặc định, nếu bạn muốn.


9

không sử dụng dấu thời gian mà theo dõi thời gian theo cách thủ công.

nếu bạn thực sự muốn cập nhật một bản ghi và không cập nhật, hãy sử dụng dấu thời gian:

UPDATE `table` SET `timestamp` = `timestamp`, `col` = 'new data' …;

14
"không sử dụng dấu thời gian", tại sao?
Petah

4
Chúng chỉ có thể đại diện cho thời gian từ 1.1.1970 đến 31.12.2037; chỉ cột dấu thời gian đầu tiên được cập nhật tự động; khi khôi phục từ dấu thời gian dự phòng được điều chỉnh theo múi giờ địa phương. Và, tùy thuộc vào ứng dụng của bạn, bạn có thể không muốn có cột đó được cập nhật khi chạy một báo cáo cập nhật sql trong backand của bạn (bạn chỉ muốn dấu thời gian cập nhật khi sử dụng lối vào của bạn để chỉnh sửa dữ liệu)
knittl

Dấu thời gian có mục đích rõ ràng là để theo dõi thời gian HIỆN TẠI, vì vậy không có vấn đề gì khi nó có phạm vi giá trị giới hạn. "Chỉ cột đầu tiên" cũng không phải là vấn đề và giả sử bạn đang sử dụng ít nhất MySQL 4.1.3, múi giờ cục bộ không phải là vấn đề, nếu bạn đã sử dụng mysqldump để sao lưu.
AnrDaemon

1
Thêm vào những gì @AnrDaemon tuyên bố, tôi chắc chắn rằng chúng tôi sẽ nhận được hỗ trợ cho các phạm vi ngày ngoài năm 2037 trước khi chúng tôi tiếp cận việc cắt bỏ đó và việc chuyển đổi dữ liệu lịch sử sang định dạng dấu thời gian mới sẽ rất dễ dàng (nếu không phải là tự động). Ngoài ra, MySQL đã hỗ trợ nhiều cột dấu thời gian ít nhất kể từ khi v5.6.10 được phát hành vào đầu năm 2013. Và nếu bạn không muốn giá trị dấu thời gian cập nhật khi bản ghi được cập nhật, thì đừng chỉ định ON UPDATE ...
nextgentech

0

Nếu bạn thay đổi bộ đếm thời gian khi cập nhật thì bạn phải cân nhắc rằng nếu giá trị đã được cập nhật nhưng không thay đổi (đã cập nhật giá trị lưu) thì nó sẽ không cập nhật "khi cập nhật Current_timestemp" và trong tình huống này, bạn nên đặt bộ đo thời gian thủ công

SET LastUpdatedDate=NOW() WHERE

Ý tưởng đến từ đây: Chạm vào bản ghi MYSQL để cập nhật trường TIMESTAMP

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.