假设在Postgresql中,我有一个表T,其中一列是C1.

我想在向表T添加新记录时触发一个函数.函数应该判断新记录中第C1列的值,如果为null/空,则将其值设置为'X'.

这可能吗?

推荐答案

您需要触发器是正确的,因为为列设置默认值对您不起作用-默认值仅适用于null个值,对防止空白值没有帮助.

在postgres中,创建触发器需要几个步骤:

步骤1:创建一个返回类型trigger的函数:

CREATE FUNCTION my_trigger_function()
RETURNS trigger AS $$
BEGIN
  IF NEW.C1 IS NULL OR NEW.C1 = '' THEN
    NEW.C1 := 'X';
  END IF;
  RETURN NEW;
END;
$$ LANGUAGE plpgsql

第2步:创建一个触发before insert的触发器,该触发器允许您在插入值之前更改值,该触发器调用上述函数:

CREATE TRIGGER my_trigger
BEFORE INSERT ON T
FOR EACH ROW
EXECUTE PROCEDURE my_trigger_function()

你完了.

请参阅the above code executing on SQLFIddle演示它是否正常工作!


您在注释中提到,值'X'是从子查询中检索到的.如果是,请更改相关行,如下所示:

NEW.C1 := (select some_column from some_table where some_condition);

Postgresql相关问答推荐

Docker化的PostgreSQL:FATAL:用户&postgres的密码身份验证失败

Postgres-pgloader-默认情况下,在PostgreSQL中将列名转换为小写

求和直到达到一个值 postgresql

使用Helm设置PostgreSQL配置

未更改表上的 Postgres 环绕预防

如何将 NULL 值插入 UUID 而不是零

使用包含重复元素的数组 Select 重复值

Django + Postgres + 大时间序列

我可以使用 Rails 将数组存储在 hstore 中吗

PostgreSQL - jsonb_each

在psql中,为什么有些命令没有效果?

如何在 psycopg2 中使用服务器端游标

PostgreSQL 不区分大小写的 SELECT 数组

断言错误:Django-rest-Framework

H2 postgresql mode模式似乎不起作用

如何在数据库表中查找重复条目?

在 postgres 中创建超级用户

错误:表tablename上的更新或删除违反外键约束

PostgreSQL 条件 where 子句

错误:permission denied for language c