带继承的PostgreSQL外键约束冲突
我有一个PostgreSQL数据库、3个表和我的模式,如下所示带继承的PostgreSQL外键约束冲突,sql,postgresql,foreign-keys,Sql,Postgresql,Foreign Keys,我有一个PostgreSQL数据库、3个表和我的模式,如下所示 --- Parent Table CREATE TABLE IF NOT EXISTS abc.parent( record_id SERIAL PRIMARY KEY, description text NOT NULL ); --- Child Table CREATE TABLE IF NOT EXISTS abc.child ( total_count INT N
--- Parent Table
CREATE TABLE IF NOT EXISTS abc.parent(
record_id SERIAL PRIMARY KEY,
description text NOT NULL
);
--- Child Table
CREATE TABLE IF NOT EXISTS abc.child (
total_count INT NOT NULL) INHERITS (abc.parent);
-- Detail
CREATE TABLE abc.detail(
detail_id int NOT NULL,
detail_description text NOT NULL
record_id int NOT NULL,
FOREIGN KEY (record_id) REFERENCES abc.parent(record_id)
);
然后我将记录插入到父表和子表中
母公司
|record_id|description|
|1 |abcd |
|2 |efgh |
孩子
当我尝试将记录插入细节表时,以下两个实体成功了
Detail
|detail_id|detail_description|record_id|
|100 |detail_desc1 | 1 |
|200 |detail_desc2 | 2 |
但我无法插入记录id为3的条目,因为它给了我一个外键冲突错误
有人能解释这个错误吗
我们可以在Postgresql中创建这样的带继承的外键关系吗
比如说:
继承特性的一个严重限制是索引
(包括唯一约束)和外键约束仅适用
到单个表,而不是它们的继承子表。这是真的
在外键约束的参照侧和参照侧
“全局索引”是表继承缺少的重要特性之一。很抱歉回答得太晚。正如其他答案所述,约束不是继承的,因此在您的情况下,父表在记录\u id上有一个主键,但子表没有相同的约束。如果没有主键,外键将无法指向它 通过向子表中添加主键约束,可以很容易地解决这个问题。下面的结构可以正常工作:
CREATE TABLE IF NOT EXISTS abc.parent
(
record_id SERIAL,
description text NOT NULL,
CONSTRAINT parent_pkey PRIMARY KEY (record_id)
);
--- Child Table
CREATE TABLE IF NOT EXISTS abc.child
(
total_count INT NOT NULL,
CONSTRAINT child_pkey PRIMARY KEY (record_id)
) INHERITS (abc.parent);
-- Detail
CREATE TABLE abc.detail
(
detail_id integer NOT NULL,
detail_description text NOT NULL,
record_id integer NOT NULL,
CONSTRAINT detail_pkey PRIMARY KEY (detail_id),
CONSTRAINT detail_record_id_fkey FOREIGN KEY (record_id)
REFERENCES abc.parent (record_id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
);
这将非常有效,并允许在详细信息表中引用子记录。请注意,我还向detail表中添加了一个primary,这是一种良好的做法(尽管这无助于回答您的问题)
有趣的是,您正在对列创建一个在CREATETABLE语句中没有提到的约束。这是继承列的本质,但一开始可能并不明显
从PostgresSQL的版本10开始,约束继承不受支持,因此必须在子表上重新创建约束(唯一、主键、外键等)。我希望他们尽快解决这个问题 我已经运行了您的代码,然后执行了以下操作:
INSERT INTO abc.child(description,total_count)值('xpto',0);将值(0,,,1)插入abc.detail(详细信息id,详细信息描述,记录id)
但收到了此错误消息:>SQL错误[23503]:错误:在表上插入或更新“detail”违反了>外键约束“detail\u record\u id\u fkey”Detalhe:key>(record\u id)=(1)在表“parent”中不存在
知道我做错了什么吗?我用的是Postgres 12。
CREATE TABLE IF NOT EXISTS abc.parent
(
record_id SERIAL,
description text NOT NULL,
CONSTRAINT parent_pkey PRIMARY KEY (record_id)
);
--- Child Table
CREATE TABLE IF NOT EXISTS abc.child
(
total_count INT NOT NULL,
CONSTRAINT child_pkey PRIMARY KEY (record_id)
) INHERITS (abc.parent);
-- Detail
CREATE TABLE abc.detail
(
detail_id integer NOT NULL,
detail_description text NOT NULL,
record_id integer NOT NULL,
CONSTRAINT detail_pkey PRIMARY KEY (detail_id),
CONSTRAINT detail_record_id_fkey FOREIGN KEY (record_id)
REFERENCES abc.parent (record_id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
);