【问题标题】:Is there a way to add an Update Constraint on a Column when creating a Table in Postgresql?在 Postgresql 中创建表时,有没有办法在列上添加更新约束?
【发布时间】:2020-10-30 07:39:07
【问题描述】:

我想在 Postgresql 9.4 中的表上执行此操作,以便在更新语句上自动更新列,就像它在 MySQL 5.6 中的工作方式一样,无需触发器?

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

Postgresql 在 UPDATE 之前对单词 ON 给出错误

错误:在“ON”或附近出现语法错误 SQL 状态:42601 字符:133

【问题讨论】:

  • Postgres 没有对应的语法。你需要一个触发器。
  • @Belayer 您好,感谢您的回答。我想知道您是否知道在具有此类列的所有表上创建触发器会降低每天大量事务的性能?还是您更愿意在生成更新时在后端代码 C# 中处理此列更新?
  • @MaximusDecimus,我怀疑性能下降甚至会很明显
  • 触发器的性能影响是可衡量的。但是您必须进行测试以查看是否有问题。

标签: sql postgresql timestamp


【解决方案1】:

当然,触发器有一些开销,但通常可以忽略不计。 (c# 选项也会有轻微的代码开销和轻微的网络开销,所以可能会折腾)。也有点取决于您对“每天大量交易”的定义。是每天 10 万个交易还是每秒 10 万个交易。通常巨大是一个相对较小的数字。确定的唯一方法是对其进行测试(确保捕获总经过时间,而不仅仅是数据库中的时间)。

Postgres 中的触发器语法与 MySql 有很大不同。在 Postgres 中,您创建一个特殊类型的函数(返回触发器)。触发器本身就是一个单一的语句,执行函数。使用 MySql,代码直接在触发器定义中(就像 Oracle - 事实上,在 Oracle 购买它之前,MySql 不支持触​​发器。)这里的好处是,任何实现相同列名的表都可以使用单个函数(至少在这种情况下)。

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

完整示例请参见fiddle。注意:Postgres 9.4 版不再支持,我建议尽快更新。对于小提琴,我使用了 9.5 版,因为它是可用的最旧版本。此外,如果小提琴很慢,那是由于“选择睡眠”语句而不是触发器。我不认为“dbfiddle”实际上尊重这些陈述。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多