gpt4 book ai didi

postgresql - 如何在 Postgresql 中创建列常量

转载 作者:行者123 更新时间:2023-11-29 11:50:13 25 4
gpt4 key购买 nike

create table test(
t_id SERIAL primary key,
t_date CONSTANT date default CURRENT_DATE
);
ERROR: syntax error at or near "date"
LINE 3: t_date CONSTANT date default CURRENT_DATE
^
********** Error **********

ERROR: syntax error at or near "date"
SQL state: 42601

最佳答案

对于默认值,您可以使用一个函数,

CREATE TABLE test(
t_id SERIAL primary key,
t_date date DEFAULT now()
);

关于 constant,我从未使用过,甚至其他 SQL(!),仅在 PL/SQL 上下文中使用...

如果您需要“无更新” 约束,您可以使用触发器。示例:

CREATE FUNCTION correct_update() RETURNS trigger AS $$ 
BEGIN
NEW.t_date=OLD.t_date;
RETURN NEW;
END
$$ LANGUAGE plpgsql;

CREATE TRIGGER no_date_update
BEFORE BEFORE UPDATE ON test
FOR EACH ROW
WHEN (OLD.t_date IS DISTINCT FROM NEW.t_date)
EXECUTE PROCEDURE correct_update();

对于完整的控件,您还需要触发 INSERT 事件,(并且不再需要默认值,因为插入触发器会执行):

create table test(
t_id SERIAL primary key,
t_date date -- a default will be redundant
);

CREATE FUNCTION correct_date() RETURNS trigger AS $$
BEGIN
IF TG_OP = 'INSERT' THEN
NEW.t_date=now(); -- default value
ELSIF TG_OP = 'UPDATE' THEN -- optional AND OLD.t_date != NEW.t_date
NEW.t_date=OLD.t_date; -- "constant" behaviour
END IF;
RETURN NEW;
END
$$ LANGUAGE plpgsql;

CREATE TRIGGER constant_date
BEFORE INSERT OR UPDATE ON test
FOR EACH ROW
EXECUTE PROCEDURE correct_date();

OLD.t_date != NEW.t_date 比较是可选的,因为它不会影响性能……但使用它是一种很好的做法。另一种方法是通过 WHEN 检查触发器,但只有更新触发器可以使用 OLD...所以,最好的创建触发器相同的 correct_date () 函数(没有新旧比较)是:

CREATE TRIGGER constant_date_ins
BEFORE INSERT ON test
FOR EACH ROW
EXECUTE PROCEDURE correct_date();
CREATE TRIGGER constant_date_upd
BEFORE UPDATE ON test
FOR EACH ROW
WHEN (OLD.t_date IS DISTINCT FROM NEW.t_date)
EXECUTE PROCEDURE correct_date();

情景化

正如上面问题中所评论的那样,缺乏语境化,例如。解释“为什么你认为这应该有效以及它应该做什么”。

场景 1:db-master 需要阻止粗心的程序员

我们可以想象一个像CakePHP这样的框架具有“已创建”字段和希望该字段具有“恒定行为”的数据库管理员,以防止粗心的程序员影响此“预期约束”。

在anwser中使用了这种场景。

场景 2:项目决策是错误提醒

这是@IgorRomanchenko 的建议...

 ... now here as a Wiki, you can EDIT and add new solution/example ...

关于postgresql - 如何在 Postgresql 中创建列常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25238226/

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