gpt4 book ai didi

postgresql - 具有外键约束的关系数据库如何摄取可能顺序错误的数据?

转载 作者:行者123 更新时间:2023-12-04 10:45:24 25 4
gpt4 key购买 nike

数据库正在从流中提取数据,满足外键约束所需的所有行可能会延迟或永远不会到达。

这可以通过使用另一个数据存储来完成,一个没有外键约束的数据存储,然后当所有需要的数据可用时,读入具有 fk 约束的数据库。但是,这增加了复杂性,我想避免它。

我们正在研究一种创建“占位符”行以将外键指向的解决方案。当真实数据进来时,占位符被替换为真实值。同样,这增加了复杂性,但这是迄今为止我们找到的最佳解决方案。

人们通常如何解决这个问题?

编辑 :一些可能有助于解释问题的示例数据:

假设我们有这些表:

CREATE TABLE order (
id INTEGER NOT NULL,
order_number,
PRIMARY KEY (id),
UNIQUE (order_number)
);

CREATE TABLE line_item (
id INTEGER NOT NULL,
order_number INTEGER REFERENCES order(order_number),
PRIMARY KEY (id)
);

如果我先下单,没问题!但是,假设我尝试:
INSERT INTO line_item (order_number) values (123)在插入订单 123 之前。这当然会使 fk 约束失败。但这可能是我获取数据的顺序,因为它是从从多个来源收集这些数据的流中读取的。

另外,为了解决@philpxy 的问题,我对此并没有真正找到太多。提到的一件事是 deferred constraints .这是一种在事务结束时等待执行 fk 约束的机制。但是,我认为在我的情况下不可能这样做,因为这些插入语句将在收到数据时随机运行。

最佳答案

您有一个业务工作流问题,因为单个订单的行项目在订单本身进入之前进入。一种解决方法可能并不理想,是创建一个插入前触发器,该触发器检查每个进入 line_item 表的插入,该订单是否已存在于 order 表中。如果没有,那么它将先插入订单记录,然后再尝试在 line_item 上插入。

CREATE OR REPLACE FUNCTION "public"."fn_insert_order" () RETURNS trigger AS $$
BEGIN
INSERT INTO "order" (order_number)
SELECT NEW.order_number
WHERE NOT EXISTS (SELECT 1 FROM "order" WHERE order_number = NEW.order_number);
RETURN NEW;
END
$$
LANGUAGE 'plpgsql'

# trigger
CREATE TRIGGER "trigger_insert_order"
BEFORE INSERT ON line_item FOR EACH ROW
EXECUTE PROCEDURE fn_insert_order()

注意:我假设 id 表的 order 列实际上是自动递增的,在这种情况下,Postgres 在插入时会自动为其分配一个值。这很可能是您想要的,因为有两个需要手动分配的 id 列没有多大意义。

关于postgresql - 具有外键约束的关系数据库如何摄取可能顺序错误的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59728017/

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