gpt4 book ai didi

PostgreSQL View 插入规则以强制执行相关表/ View 中的值

转载 作者:行者123 更新时间:2023-12-03 23:02:29 25 4
gpt4 key购买 nike

我有 2 个观点:

CREATE VIEW v_foo AS
SELECT
foo.id AS id,
foo.name AS name,
foo.userId AS userId
FROM foo;
CREATE VIEW v_bar AS
SELECT
bar.id AS id,
bar.name AS name,
bar.fooId AS fooId,
foo.userId AS userId
FROM bar
JOIN foo ON foo.id = bar.fooId;
我正在尝试建立一个 INSERT 规则
CREATE OR REPLACE RULE v_bar_INSERT AS ON INSERT TO v_bar
DO INSTEAD(
INSERT INTO bar (name, fooId) VALUES (NEW.id, NEW.fooId)
RETURNING bar.id, bar.name, bar.fooId, NULL::integer
--we don't care about return values for userId
);
我的问题是我需要检查 foo WHERE id=NEW.fooId AND userId=NEW.userId 上是否存在记录,如果没有,则插入失败。本质上,v_bar 需要通过其与 foo 的关系来继承 userId,并确保在向 bar 中插入新记录时,id 和 userId 在 foo 中是成对存在的。
我们正在重组一个模式以使用现有的应用程序层,这就是为什么明显的愚蠢。

最佳答案

如果添加 userId列到 bar表不是问题,可能的解决方案是:

  • 添加 userId列到 bar table ;
  • 修改 JOIN v_bar的条款查看如下:
  • JOIN foo ON foo.id = bar.fooId AND foo.userId = bar.userId;
  • 修改 INSERT v_bar_INSERT的条款规则如下:
  • INSERT INTO bar (name, fooId, userId) VALUES (NEW.id, NEW.fooId, NEW.userId)
  • (fooId, userId) 上添加外键专栏情侣bar表到 foo 的相同字段表

  • 这将强制执行检查,不仅在插入时永远遵守。
    您没有指定一旦成功执行 INSERT 是否也应该在将来遵守对存在的检查,或者如果引用 foo记录可以删除。
    在第一种情况下,此解决方案也将强制执行 future 检查,在第二种情况下,此解决方案不适用。

    关于PostgreSQL View 插入规则以强制执行相关表/ View 中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64760129/

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