postgresql - 超出堆栈深度限制 PostgreSQL 插入触发器
问题描述
我正在尝试创建一个简单的触发器,该触发器将一行插入到朋友表中,并使用倒置的值,所以当插入 (1,2) 时 (2,1) 也插入了,但我一直收到这个错误,我没有确定出了什么问题。
错误:超出堆栈深度限制提示:在确保平台的堆栈深度限制足够之后,增加配置参数“max_stack_depth”(当前为 2048kB)。上下文:SQL 语句“插入朋友(ID1,ID2)值(NEW.ID2,NEW.ID1)”PL/pgSQL 函数friend_add()在 SQL 语句的第 2 行
CREATE OR REPLACE FUNCTION public.friend_add()
RETURNS trigger
LANGUAGE 'plpgsql'
VOLATILE
COST 100
AS $BODY$begin
insert into friend(ID1,ID2) values (NEW.ID2, NEW.ID1);
return new;
end
end;$BODY$;
CREATE TRIGGER friend_add
AFTER INSERT
ON public.friend
FOR EACH ROW
EXECUTE PROCEDURE public.friend_add();
这是我的函数和触发器定义。
解决方案
这是一个无限循环:您插入 ID1-ID2,然后触发器插入 ID2-ID1,它被再次插入 ID1-ID2 等的触发器捕获。
您只需插入一次。最简单的(并且可能是最安全的)是对 ID1-ID2 有一个唯一的约束,并做一个 upsert:
insert into friend(ID1,ID2) values (NEW.ID2, NEW.ID1) ON CONFLICT (ID1,ID2) DO NOTHING;
推荐阅读
- javascript - Html 画布元素的 getImageData 与 Fabricjs 画布的内容不匹配
- javascript - CKEditor、MongoDB 和 NodeJs:文本以 HTML 格式显示
- sas - 将(内部存在的)列标题作为第一行插入到表中
- javascript - 使样式反应 JS
- python - Nohup 在终止之前不会打印到标准输出
- c++ - Linux重复缓冲区?
- python - Python Session 帖子无法打开我的网络浏览器
- javascript - React native - “this.setState 不是函数”试图为背景颜色设置动画?
- python - 如何使用列表推导计算嵌套列表的 bmi?
- reactjs - React 应用程序没有出现在实时服务器上(在本地工作) - 没有可见的错误,可疑的后端问题