【问题标题】: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 好的,我已经添加了。

标签: sql postgresql triggers


【解决方案1】:
CREATE TRIGGER check_insert 
BEFORE INSERT ON "mytable"
FOR EACH ROW 
WHEN (NEW.status = 'current')
EXECUTE PROCEDURE insert_new();

您有AFTER INSERT 检查,删除触发器,然后使用BEFORE 而不是AFTER 创建并再次尝试插入

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多