2011-01-04 70 views
19

私のデータベースにはtimestampという列があります。テーブルの行を更新する必要があり、timestamp列を更新する必要があります。更新コマンドを実行すると、次のようになります。SQL Serverのタイムスタンプ列の更新

Cannot update a timestamp column. 

タイムスタンプ列を更新するにはどうすればよいですか?

答えて

28

あなたはない

timestamp column is updated automaticallyを行います。おそらくタイムスタンプに時間に関する価値が含まれているという印象を受けているでしょうか?そうではありませんが、単純にそのレコードの値が更新されるたびに更新される数値です。 行のバージョン番号のように考えてください。 MSDNから

timestampデータ型は、ちょうど インクリメント数、 日付や時刻を保存しません。

+9

は非常に直感的に更新されますそれはそうではありません....:P –

+1

@JacquesBosch - 私はそれが非常に誤解を招くことに同意します –

2

あなたはタイムスタンプ列を更新しない - 行の他の列が更新されるたびにタイムスタンプ(今rowversionに改称)の列は、SQL Serverによって自動的に更新されます。


あなたはすでにこれを知っていたが、何らかの理由だけであなたが影響を受けたい行に対して更新を実行、更新する列を強制したい場合。それは実際のデータ変化をもたらす場合であっても、タイムスタンプ列は、まだ更新されます:

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

鉱山は、私はTIMESTAMPを誤解することができますどのように言及したかったあなたの質問への答えではありませんが。

質問にはTIMESTAMPの列を使用しているとは述べていませんが、実際には更新しようとしているのはデータが変更されたときに記録しようとしていることです。

は、あなたが実際にDATETIMEを使用して変更を記録したいときTIMESTAMPを使用してについて(他の多くは、ネット上にもあります)this articleを見てください。

BOLは言う:

SQL Serverのタイムスタンプデータ型 は、時間や日付とは何の関係もありません。 SQL Serverのタイムスタンプは、 という2進数で、 のデータ変更がデータベースで発生した相対 シーケンスを示しています。 タイムスタンプのデータ型は、もともとは 回復アルゴリズムをサポートするために実装された でした。

Damien_The_Unbelieverは、タイプの名前が変更されたと言うと説明が言うように:

rowversionデータ型がちょうど インクリメント番号、 は、日付や時刻を保存しません。 日付または時刻を記録するには、datetime2データ を使用します。あなたが意図的にデータ型を使用している場合はもちろん

、:)上記のすべてを無視

+0

日付と時刻をTIMESTAMP列に格納することはできませんので、慎重ではありません。私はこの答えは誤解を招くと思います。 –

+1

@ m.edmondson:あなたは正しいです、私の答えの文言は少し誤解を招いています。 SallyがTIMESTAMP列にdatetime値を入れようとしていると推測していませんでした。ちょうどTIMESTAMPが編集が行われた時点の自動記録を提供すると誤解されることがあります。 DATETIMEはデータの結果です。 – Tony

1

タイムスタンプ列は、それがサーバーに生成されるので、更新することができないと全体のために一意であることがgauranteedさ データベース - 更新が許可されていない場合、値は一意ではありません。

レプリケートされたインスタンスがパブリッシャと同じタイムスタンプ値を持たないため、レプリケートされたインスタンスのタイムスタンプ列を更新しようとして同じ問題が発生しました。これは、レコードグループごとに最後に更新されたレコードを取得しようとしたときに問題が発生しました。もちろん、レプリケーションでは、パブリッシャで同じタイムスタンプ値をサブスクライバにレプリケートできるようにするのはシンプルな構成でした。

他の方法では、タイムスタンプ値を更新する他の方法はありません。

0

私は、私の解決策を同じ問題を抱えていた:

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

いつのようにテーブルの値は、タイムスタンプを変更したときに再計算され、私は同じ値に任意の列を更新するため、タイムスタンプが