sql—在postgresql中创建表时,有没有方法在列上添加更新约束?

lg40wkob  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(261)

我想在postgresql9.4中的一个表上这样做,以便在update语句中自动更新列,就像在mysql 5.6中不使用触发器那样?

create table test
(
id varchar(10),
updated timestamp not null default now() ON UPDATE now()
)

postgresql在更新前给出了一个单词on的错误
错误:语法错误位于或接近“on”sql状态:42601字符:133

laximzn5

laximzn51#

当然,触发器有一些开销,但通常可以忽略不计(c#选项也会有少量的代码开销和少量的网络开销,所以可能是一个折腾)。这在一定程度上取决于你对“每天交易量巨大”的定义。是每天1000笔交易,还是每秒1000笔交易。通常巨大的是一个相对较小的数字。唯一确定的方法是测试它(确保捕获总运行时间,而不仅仅是数据库中的时间)。
postgres中的触发器语法与mysql有很大的不同。在postgres中创建一个特殊类型的函数(返回触发器)。触发器本身是一个语句,即execute函数。使用mysql时,代码直接位于触发器定义中(就像oracle一样-事实上,在oracle购买mysql之前,mysql不支持触发器)。这里的好处是,任何实现相同列名的表都可以使用这个函数(至少在本例中是这样)。

create or replace 
function set_updated_timestamp()
 returns trigger 
 language plpgsql
as $$
begin   
    new.updated = now();
    return new;
end;
$$;

完整的例子见小提琴。注意:Postgres9.4版本不再受支持,我建议您尽快更新。对于fiddle,我使用了9.5版本,因为它是最老的版本。另外,如果fiddle速度慢,则是由于“select sleep”语句而不是触发器。我不认为“db<>fiddle”真的尊重这些说法。

相关问题