检查 postgresql 的返回查询中是不是存在值
Posted
技术标签:
【中文标题】检查 postgresql 的返回查询中是不是存在值【英文标题】:Check if a value exists in a return query in postgresql检查 postgresql 的返回查询中是否存在值 【发布时间】:2017-05-07 10:25:47 【问题描述】:我是 postgresql 的新手。我制作了一个在插入表后启用的触发器。我的表有它的值,start_date 的 1 个日期值和 end_date 的 1 个日期值。当我在表中插入新行时,我想检查是否与任何现有日期重叠。所以我的触发器如下:
CREATE OR REPLACE FUNCTION insert_new()
RETURNS TRIGGER AS $$
BEGIN
if ( 't' = any (select ((NEW.start_date, NEW.end_date) overlaps (start_date, end_date)) from "mytable") ) then
RAISE EXCEPTION 'Invalid insertion!';
else
return NEW;
end if;
END;
$$ LANGUAGE plpgsql;
这对我来说似乎是正确的,但是当我尝试在表中插入新行时,每次都会出现异常。我不明白为什么会这样..有什么想法吗?提前谢谢..
这里是创建触发代码:
CREATE TRIGGER check_insert
AFTER INSERT ON "mytable"
FOR EACH ROW
WHEN (NEW.status = 'current')
EXECUTE PROCEDURE insert_new();
【问题讨论】:
我不知道它是否会有所帮助,这只是快速通知。检查它是否有帮助:if 't' = any (select ((NEW.start_date, NEW.end_date) overlaps (start_date, end_date)) from "mytable") then
那个括号看起来有点可疑,但我真的不知道。
@Sylogista 我试过不带括号但我得到了相同的结果..
向我们展示您在表上的触发器定义(CREATE TRIGGER 代码)
@OtoShavadze 好的,我已经添加了。
【参考方案1】:
CREATE TRIGGER check_insert
BEFORE INSERT ON "mytable"
FOR EACH ROW
WHEN (NEW.status = 'current')
EXECUTE PROCEDURE insert_new();
您有AFTER
INSERT 检查,删除触发器,然后使用BEFORE
而不是AFTER
创建并再次尝试插入
【讨论】:
以上是关于检查 postgresql 的返回查询中是不是存在值的主要内容,如果未能解决你的问题,请参考以下文章