Sybase默认时间戳值

2022-07-18 00:00:00 sql 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语句的日期时间进行更新。

相关文章