我想使用触发器对属性实现非空约束。 这是我的代码:
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 字符串比较区分大小写。 INSERT
与 insert
不同。尝试:
IF tg_op = 'INSERT' THEN
建议
您只是在发出通知。这允许控制流继续到过程中的下一行。您通常应该RAISE EXCEPTION
来中止执行并回滚事务。参见 RAISE
.就目前而言,触发器将导致不满足要求的插入静默失败,这通常不是您想要的。
此外,如果触发器总是应该在函数结束之前返回,那么它们通常应该以 RAISE EXCEPTION
结尾。这会帮助您更快地发现问题所在。
关于sql - 在 SQL 中使用触发器的非空约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15997104/