本文介紹了Sybase默認時間戳值的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我有一個帶有UPDATE_DATETIME列的Sybase表,只要發生插入/更新,就必須更新該列。我已經創建了如下表格
CREATE TABLE items
(
name VARCHAR(90),
update_datetime DATETIME DEFAULT GETDATE(),
price NUMERIC(7,2)
);
插入后,我可以看到當前日期時間正在更新
INSERT INTO items(name, price) VALUES ('Apple', 1.29);
但在更新之后,我沒有看到此列得到更新,但在插入過程中更新的舊值仍然存在。
UPDATE items SET price = price - 0.2 WHERE name = 'Apple';
我不確定為什么?請幫助確定原因
推薦答案
假設這是Sybase ASE 15.x/16.x…
列的默認設置僅適用于插入操作。
要使用每個UPDATE語句更新update_datetime
列,您需要使用觸發器或將update_datetime
重新定義為計算列;對于后者,您通常需要定義一個函數調用,該函數調用引用您預期將始終使用UPDATE語句修改的表中的另一列,例如:
CREATE TABLE items
(name VARCHAR(90)
,price NUMERIC(7,2)
,ts timestamp
,update_datetime compute dateadd(ss,0*ts,getdate()) materialized
)
注意:計算列定義必須出現在計算列中引用的列之后;在這種情況下,update_datetime
必須列在ts
之后
timestamp
數據類型是一種特殊的Sybase ASE數據類型;用于定義列時,ASE將在每次修改/更新行的任何部分時自動更新該列:
好處:我們不需要事先知道哪些列可能被更新(放在計算列定義中)
缺點:我們向表中添加一個8字節的timestamp
列
由于ts
列總是在UPDATE語句上修改,并且timestamp
值以8字節二進制形式存儲,因此我們可以用*0
來求反它的值;然后將得到的0
秒(ss
)與getdate()
相加,為update_datetime
列派生一個新值;Net Result:update_datetime
用針對此行應用的每個UPDATE語句的日期時間進行更新。
這篇關于Sybase默認時間戳值的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,