代码之家  ›  专栏  ›  技术社区  ›  Maximus Decimus

在Postgresql中创建表时,有没有办法在列上添加更新约束?

  •  0
  • Maximus Decimus  · 技术社区  · 4 年前

    我想在Postgresql 9.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

    0 回复  |  直到 4 年前
        1
  •  1
  •   Belayer    4 年前

    当然,触发器会带来一些开销,但通常可以忽略不计。(c#选项也会有轻微的代码开销和轻微的网络开销,所以可能是一个折腾)。这在一定程度上取决于你对“每天交易量巨大”的定义。是每天1000次交易中的10次还是每秒1000次交易中的10次。通常情况下,庞大的数字相对较小。唯一确定的方法是测试它(确保捕获总运行时间,而不仅仅是数据库中的时间)。

    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;
    $$;
    

    看见 fiddle 举个完整的例子。注:Postgres 9.4版 不再支持 ,我建议尽快更新。对于fiddle,我使用了9.5版,因为它是最古老的版本。此外,如果fiddle运行缓慢,则是由于“select sleep”(选择睡眠)语句,而不是触发器。我不认为“db<>fiddle”实际上尊重这些说法。