2011-01-04 48 views
19

Trong cơ sở dữ liệu của tôi, tôi có cột timestamp. Tôi cần cập nhật một hàng trong bảng và cần cập nhật cột timestamp. Khi tôi chạy lệnh cập nhật, tôi nhận được:Máy chủ SQL cập nhật cột dấu thời gian

Cannot update a timestamp column. 

Làm cách nào để cập nhật cột dấu thời gian?

Trả lời

28

Bạn không

Các timestamp column is updated automatically. Có lẽ bạn đang theo ấn tượng rằng dấu thời gian có chứa một giá trị liên quan đến thời gian? Nó không, nhưng chỉ đơn giản là một số được cập nhật bất cứ khi nào một giá trị trong bản ghi đó là. Hãy suy nghĩ về nó giống như một số phiên bản hàng.

Từ MSDN:

Các dấu thời gian kiểu dữ liệu chỉ là một số tăng và không giữ gìn một ngày hoặc một thời điểm.

+9

Rất trực quan đặt tên ở đó, không phải là nó ....: P –

+1

@JacquesBosch - Tôi đồng ý nó rất gây hiểu nhầm –

2

Bạn không cập nhật cột dấu thời gian - cột dấu thời gian (giờ được đổi tên rowversion) được máy chủ SQL tự động cập nhật bất cứ khi nào bất kỳ cột nào khác trong hàng được cập nhật.


Nếu bạn đã biết điều này, nhưng vì một lý do nào đó muốn buộc cập nhật, chỉ cần thực hiện cập nhật đối với hàng bạn muốn bị ảnh hưởng. Thậm chí nếu nó kết quả trong không thay đổi dữ liệu thực tế, cột timestamp vẫn sẽ cập nhật:

create table #T1 (
    ID int not null, 
    ts timestamp not null 
) 
insert into #T1 (ID) 
select 1 union all 
select 2 
select * from #T1 
update #T1 set ID = ID where ID=1 
select * from #T1 

ID ts 
1 0x0000000000039AAF 
2 0x0000000000039AB0 

ID ts 
1 0x0000000000039AB1 
2 0x0000000000039AB0 
2

Mặc dù tôi không phải là một câu trả lời cho câu hỏi của bạn tôi muốn đề cập đến cách TIMESTAMP có thể bị hiểu lầm.

Bạn không tuyên bố sử dụng cột TIMESTAMP trong câu hỏi của mình nhưng thực tế bạn đang cố gắng cập nhật nó ngụ ý (với tôi) bạn đang cố ghi lại khi dữ liệu của bạn thay đổi.

Hãy xem this article (cũng có nhiều người khác trên mạng) về việc sử dụng TIMESTAMP khi bạn thực sự muốn ghi lại thay đổi bằng cách sử dụng DATETIME.

BOL nói:

Các SQL Server timestamp dữ liệu loại có gì để làm với thời gian hoặc ngày. Dấu thời gian của SQL Server là số nhị phân cho biết chuỗi tương đối trong đó sửa đổi dữ liệu diễn ra trong cơ sở dữ liệu. Loại dữ liệu dấu thời gian ban đầu được thực hiện được triển khai để hỗ trợ thuật toán khôi phục SQL Server .

Như Damien_The_Unbeliever nói loại đã được đổi tên và mô tả nói:

Các rowversion kiểu dữ liệu chỉ là một số tăng và không giữ gìn một ngày hoặc một thời điểm.Để ghi lại ngày ngày hoặc giờ, hãy sử dụng dữ liệu datetime2 .

Tất nhiên, nếu bạn đang sử dụng các kiểu dữ liệu theo cách thức có ý định bỏ qua tất cả những điều trên :)

+0

Không thể lưu trữ ngày và giờ trong cột TIMESTAMP để không có gì phải thận trọng. Tôi nghĩ câu trả lời này là sai lầm. –

+1

@ m.edmondson: Bạn nói đúng, từ ngữ của câu trả lời của tôi có một chút sai lệch. Tôi đã không suy luận rằng Sally đang cố gắng đặt giá trị datetime trong cột TIMESTAMP, chỉ đôi khi mọi người bị lừa khi nghĩ TIMESTAMP sẽ cung cấp bản ghi tự động về thời điểm khi chỉnh sửa được thực hiện và sau đó thử trích xuất DATETIME kết quả từ dữ liệu. – Tony

1

timestamp cột không thể được cập nhật kể từ khi nó được máy chủ được tạo ra và được gauranteed phải là duy nhất cho toàn bộ cơ sở dữ liệu - nếu các bản cập nhật được cho phép, mà nó không được, thì giá trị đó không phải là đáng tin cậy để là duy nhất.

tôi phải đối mặt với cùng một vấn đề cố gắng cập nhật cột dấu thời gian trong một bản sao được sao chép vì trường hợp được sao chép không có giá trị dấu thời gian giống như nhà xuất bản - điều này gây ra một số sự cố khi cố gắng lấy bản ghi cập nhật mới nhất cho mỗi nhóm bản ghi. tất nhiên, với sự sao chép, nó là một cấu hình đơn giản tại nhà xuất bản để kích hoạt cùng một giá trị dấu thời gian để nhân rộng cho người đăng ký.

nếu không, không có cách nào khác để cập nhật giá trị dấu thời gian.

0

tôi đã cùng một vấn đề, giải pháp của tôi:

UPDATE [table] 
SET [ANY_COLUMN] = [ANY_COLUMN] 
WHERE ID = [ID] 

như bất cứ lúc nào khi một giá trị bảng thay đổi dấu thời gian được tính toán lại, tôi cập nhật bất kỳ cột với cùng giá trị do đó timestamp được cập nhật

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