由 MySQL 的 ON UPDATE CURRENT_TIMESTAMP 带来的启发,AntDB 是否可以实现 UPDATE 时自动更新字段值。
方案
- 方案1:尝试为需要自动更新的字段自动创建 TRIGGER。
- 方案2:尝试通过 DEFAULT EXPRESSION 来实现字段值的自动更新。
实现
方案1
方案2
1. PostgreSQL 默认的 default expression 实现
CREATE TABLE ts (
id int,
value int DEFAULT 0,
tt timestamp DEFAULT current_timestamp
);
2. 查看 pg_attrdef
postgres=# \d ts
Table "public.ts"
Column | Type | Modifiers
--------+-----------------------------+---------------
id | integer |
value | integer | default 0
tt | timestamp without time zone | default now()
postgres=# select adrelid::regclass, adnum, pg_get_expr(adbin, adrelid) from pg_attrdef where adrelid = 'ts'::regclass ;
adrelid | adnum | pg_get_expr
---------+-------+-------------
ts | 2 | 0
ts | 3 | now()
(2 rows)
3. 扩展 default expression 语法
新增 ColDefaultWhen 规则,对 default expression 修饰,表示 default expression 的生效时机。
DEFAULT b_expr ColDefaultWhen
{
Constraint *n = makeNode(Constraint);
n->contype = CONSTR_DEFAULT;
n->location = @1;
n->raw_expr = makeDefaultExpr($3, $2, @2);
n->cooked_expr = NULL;
$$ = (Node *)n;
}
ColDefaultWhen:
ON INSERT { $$ = DEF_ON_INSERT; }
| ON UPDATE { $$ = DEF_ON_UPDATE; }
| ON INSERT OR UPDATE { $$ = DEF_ON_INSERT | DEF_ON_UPDATE; }
| { $$ = DEF_ON_INSERT; }
;
4. 新增 DefaultExpr 数据结构
/*
* Default Expression
*/
typedef struct DefaultExpr
{
NodeTag type;
int16 def_when; /* when to set default expression */
Node *def_expr; /* default expression */
int location; /* token location, or -1 if unknown */
} DefaultExpr;