sql - 在 SQL 中使用触发器的非空约束

标签 sql postgresql plpgsql

我想使用触发器对属性实现非空约束。 这是我的代码:

create table mytable2(id int);

create or replace function p_fn() returns trigger as $prim_key$
begin
  if (tg_op='insert') then
    if (id is null) then
      raise notice 'ID cannot be null';
      return null;
    end if;
    return new;
  end if;
end;
$prim_key$ language plpgsql;

create trigger prim_key
before insert on mytable2
for each row execute procedure p_fn();

但每当我尝试插入一个空值时,我都会收到一条错误消息,提示“控制已到达触发器过程的末尾,无需返回”。我尝试在内部 IF 中放置“return new”语句,但它仍然给了我同样的错误。我做错了什么?

最佳答案

问题的直接原因是 PostgreSQL 字符串比较区分大小写。 INSERTinsert 不同。尝试:

IF tg_op = 'INSERT' THEN

建议

您只是在发出通知。这允许控制流继续到过程中的下一行。您通常应该RAISE EXCEPTION 来中止执行并回滚事务。参见 RAISE .就目前而言,触发器将导致不满足要求的插入静默失败,这通常不是您想要的。

此外,如果触发器总是应该在函数结束之前返回,那么它们通常应该以 RAISE EXCEPTION 结尾。这会帮助您更快地发现问题所在。

关于sql - 在 SQL 中使用触发器的非空约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15997104/

相关文章:

mysql - SQL 对同一查询中的两个值求和

postgresql - 错误 "functions in index expression must be marked IMMUTABLE",不是时间戳

node.js - PostgreSQL 选择数组在数组中的数据

postgresql - SET LOCAL 为先前存储的值

sql - 具有不同返回类型(和不同内部查询)的 PL/pgSQL 函数

SQL GROUP BY 和 HAVING

c# - 帮助处理用户关系

postgresql - 如何列出受级联删除影响的表

postgresql - 类型整数 : "(2,2)" with composite data type while executing function 的输入语法无效

MySQL 函数/循环