检查 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 的返回查询中是不是存在值的主要内容,如果未能解决你的问题,请参考以下文章

Postgresql - 选择返回时插入

检查 json 类型列 PostgreSQL 中是不是存在字段

PostgreSQL:多个存在返回不正确的结果

PostgreSQL - 检查反向值行是不是存在的最佳方法

如何检查 postgres 用户是不是存在?

在 postgresql 查询中检查布尔真/假结果