gpt4 book ai didi

postgresql - 在 postgresql 中触发日期

转载 作者:行者123 更新时间:2023-11-29 14:33:14 28 4
gpt4 key购买 nike

我阅读了很多关于如何创建触发器的文章,但我真的不知道如何根据日期创建触发器。

我想添加一个触发器:1. 在添加或更新之前检查特定日期的分钟数总和是否高于 50。

因此在示例实体中:

CREATE TABLE employees(
id int serial primary key,
minutes int NOT NULL,
date date NOT NULL
);

这是数据库中的典型数据:

(1, 40, '2018-01-1')
(2, 30, '2018-01-2')
(3, 20, '2018-01-3')
(4, 10, '2018-01-4')

现在如果我添加:

(6, 20, '2018-01-1')
(7, 40, '2018-01-2')
(8, 20, '2018-01-3')
(9, 20, '2018-01-4')

最终结果会是:

(1, 40, '2018-01-1')
(2, 30, '2018-01-2')
(3, 20, '2018-01-3')
(4, 10, '2018-01-4')
(8, 20, '2018-01-3')
(9, 20, '2018-01-4')

带6和7的id省略(不加,因为都大于50)

非常感谢您的帮助:)

更新:在@Laurenz Albe 的帮助下,我创建了如下函数和触发器:

        CREATE FUNCTION func_check_minutes() RETURNS trigger AS
$$
BEGIN
IF (SELECT sum(minutes) + NEW.minutes FROM employees WHERE date = NEW.date) > 50
THEN RETURN NULL;
END IF;
END;
$$
LANGUAGE 'plpgsql';

CREATE TRIGGER tr_check_minutes
BEFORE INSERT ON employees
FOR EACH ROW
EXECUTE PROCEDURE func_check_minutes();

但是这个解决方案在没有明确原因的情况下失败了。

最佳答案

由于您没有提到失败的原因,我假设没有任何内容被写入表中。您必须在 END IF

之后添加 RETURN NEW

我已经更新了触发器

CREATE FUNCTION func_check_minutes() RETURNS trigger AS
$$
BEGIN
IF (SELECT sum(minutes) + NEW.minutes FROM employees WHERE date = NEW.date) > 50
THEN RETURN NULL;
END IF;

RETURN NEW;

END;
$$
LANGUAGE 'plpgsql';

CREATE TRIGGER tr_check_minutes
BEFORE INSERT ON employees
FOR EACH ROW
EXECUTE PROCEDURE func_check_minutes();

关于postgresql - 在 postgresql 中触发日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48537010/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com