gpt4 book ai didi

sql - 如何为表的行的子集创建外键约束?

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

我有一个引用表,比如 OrderType,它收集不同类型的订单:

CREATE TABLE IF NOT EXISTS OrderType (name VARCHAR);
ALTER TABLE OrderType ADD PRIMARY KEY (name);
INSERT INTO OrderType(name) VALUES('sale-order-type-1');
INSERT INTO OrderType(name) VALUES('sale-order-type-2');
INSERT INTO OrderType(name) VALUES('buy-order-type-1');
INSERT INTO OrderType(name) VALUES('buy-order-type-2');

我希望从另一个表创建 FK 约束,例如 SaleInformation,指向该表 (OrderType)。但是,我想表达的是,并非 OrderType 的所有行都符合该 FK 的目的(它应该只是与销售相关的订单类型)。

我想创建一个表 OrderType 的 View ,其中只有正确的行类型( View SaleOrderType)并向该 View 添加 FK 约束,但 PostgreSQL 犹豫不决与:

ERROR: referenced relation "SaleOrderType" is not a table 

看来我无法为 View 创建 FK 约束(为什么?)。我是否只能选择创建一个冗余表来保存与销售相关的订单类型?另一种方法是简单地允许 FK 指向原始表,但我并没有像我希望的那样严格地表达约束。

最佳答案

我认为你的模式应该是这样的

create table order_nature (
nature_id int primary key,
description text
);
insert into order_nature (nature_id, description)
values (1, 'sale'), (2, 'buy')
;

create table order_type (
type_id int primary key,
description text
);
insert into order_type (type_id, description)
values (1, 'type 1'), (2, 'type 2')
;

create table order_nature_type (
nature_id int references order_nature (nature_id),
type_id int references order_type (type_id),
primary key (nature_id, type_id)
);

insert into order_nature_type (nature_id, type_id)
values (1, 1), (1, 2), (2, 1), (2, 2)
;

create table sale_information (
nature_id int default 1 check (nature_id = 1),
type_id int,
foreign key (nature_id, type_id) references order_nature_type (nature_id, type_id)
);

如果外键子句也接受一个表达式,则销售信息可以省略 nature_id 列

create table sale_information (
type_id int,
foreign key (1, type_id) references order_nature_type (nature_id, type_id)
);

注意外键中的1

关于sql - 如何为表的行的子集创建外键约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21651312/

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