注册
兼容on update语法
专栏/Database Thinking/ 文章详情 /

兼容on update语法

胡li 2025/04/25 89 1 0
摘要 从DM8 第三季度版开始支持该功能:版本号:select * from v$version;DM Database Server 64 V8 DB Version: x7000c 03134284094-20230919-202737-20067

语法说明

支持为TIMESTAMP和DATETIME类型列设置ON UPDATE自动更新时间,即更新表中其他列数据时,该列会自动更新记录当前时间戳。
列定义子句中新增ON UPDATE自动更新选项。支持建表、修改表(添加列、修改列)时使用<列定义子句>中的“ON UPDATE <自动更新表达式>”设置自动更新时间。
<列定义子句> ::=
DEFAULT <列缺省值表达式> |
<自增列子句> |
<列级约束定义> |
DEFAULT <列缺省值表达式> <列级约束定义> |
<自增列子句> <列级约束定义> |
<列级约束定义> DEFAULT <列缺省值表达式> |
<列级约束定义> <自增列子句> |
ON UPDATE <自动更新表达式>

注意事项:

  1. TIMESTAMP或DATETIME类型列可以设置自动更新,其他类型报错
  2. 虚拟列不支持设置ON UPDATE
  3. 表中只允许设置一列自动更新列
  4. 设置的表达式只能是下列函数之一: getdate, now, sysdate, localtimestamp,否则报错
  5. 小数秒精度只能用整数常量指定,且必须与列类型的小数秒精度一致,特别提醒sysdate的默认精度是0,且只能为0,所以指定on update sysdate时,timestamp/datetime类型的精度需要指定为0

更新规则

  1. 当表中其他列的值被修改时,该列的值自动更新为当前时间;
create table t1(c1 int, update_time timestamp on update now);
insert into t1 values(1, NULL);

SQL> select * from t1;
行号 C1 UPDATE_TIME
1 1 NULL
SQL> update t1 set c1 = c1 + 1;
影响行数 1
SQL> select * from t1;
行号 C1 UPDATE_TIME
1 2 2023-05-18 10:54:59.755000

2.当更新语句设置其他列新数据为当前值,即数据没有发生变化时,自动更新列并不更新;
SQL> update t1 set c1 = 2;
影响行数 1
SQL> select * from t1;
行号 C1 UPDATE_TIME
1 2 2023-05-18 10:54:59.755000

3.显式更新优先级高于自动更新,显式对自动更新列更新时,其值被修改为指定值;
SQL> update t1 set c1 = c1 + 1, update_time = '2023-01-01 00:00:00.000000';
影响行数 1
SQL> select * from t1;
行号 C1 UPDATE_TIME
1 3 2023-01-01 00:00:00.000000

4.是否自动更新的判断依据只有UPDATE语句中使用SET显式更新的项,忽略引用约束引发的数据更新;

create table t2(c1 int primary key, update_time timestamp on update now);
create table t3(c1 int references t2(c1) on update cascade, update_time timestamp on update now);
insert into t2 values(1, NULL);
insert into t3 values(1, NULL);

SQL> select * from t2;
行号 C1 UPDATE_TIME
1 1 NULL
SQL> select * from t3;
行号 C1 UPDATE_TIME
1 1 NULL
SQL> update t2 set c1 = c1 + 1;
影响行数 1
SQL> select * from t2;
行号 C1 UPDATE_TIME
1 2 2023-05-18 11:16:24.570000
SQL> select * from t3;
行号 C1 UPDATE_TIME
1 2 NULL

5.是否自动更新的判断依据是SET显式设置的值,不关心对UPDATE动作创建的触发器中替换的新行值;

drop trigger tri1;
delete * from t1;
insert into t1 values (1, NULL);

SQL> select * from t1;
行号 C1 UPDATE_TIME
1 1 NULL
SQL> create trigger tri1 before update on t1
2 for each row
3 begin
4 set new.c1 = old.c1;
5 end;
6 /
操作已执行
SQL> update t1 set c1 = c1 + 1;
影响行数 1
SQL> select * from t1;
行号 C1 UPDATE_TIME
1 1 2023-05-18 11:20:25.682000

6.不允许分区列/分布列设置ON UPDATE自动更新
7.自动更新的判断依据涉及大字段列时,不比较具体数据,直接视作大字段列数据已发生变化
8.各类型表在各环境下使用UPDATE语句均支持自动更新,包括普通表、HUGE表、视图,在各单机和集群环境下使用UPDATE语句。
tabledef等获取表定义的函数,dimp/dexp工具中,支持新增的ON UPDATE选项。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服