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语句的日期时间进行更新。
相关文章