簡體   English   中英

PostgreSQL外鍵引用繼承表

[英]PostgreSQL foreign key references inherited table

我試圖通過繼承簡化我的代碼。 這是我現在所擁有的

DROP SCHEMA PUBLIC CASCADE;
CREATE SCHEMA PUBLIC;

CREATE TABLE student(
   id SERIAL PRIMARY KEY,
   age INT
);

CREATE TABLE engineer(
   id SERIAL PRIMARY KEY,
   studentId INT REFERENCES student (id),
   friend INT REFERENCES student (id)
);

CREATE TABLE artist(
   id SERIAL PRIMARY KEY,
   studentId INT REFERENCES student (id),
   friend INT REFERENCES student (id)
);

INSERT INTO student (age) VALUES (20); --Trying to remove this
INSERT INTO student (age) VALUES (21); --Trying to remove this
INSERT INTO engineer (studentId) VALUES (1);
INSERT INTO artist (studentId,friend) VALUES (2,1);

我不想鍵入這兩行,因此,我正在使用以下行

DROP SCHEMA PUBLIC CASCADE;
CREATE SCHEMA PUBLIC;

CREATE TABLE student(
   studentId SERIAL PRIMARY KEY,
   age INT
);

CREATE TABLE engineer(
   id SERIAL PRIMARY KEY,
   friend INT REFERENCES student (studentId)
) INHERITS (student);

CREATE TABLE artist(
   id SERIAL PRIMARY KEY,
   friend INT REFERENCES student (studentId)
) INHERITS (student);

INSERT INTO engineer (id,age) VALUES (DEFAULT,20);
INSERT INTO artist (id,age,friend) VALUES (DEFAULT,20,1);

但是我收到以下錯誤。

psql:test.psql:45: ERROR:  insert or update on table "artist"     
violates foreign key constraint "artist_friend_fkey"
DETAIL:  Key (friend)=(1) is not present in table "student".

這是添加到一長串Postgres問題中的又一個限制嗎?

是。 看一下文檔“底部警告”部分:

繼承功能的一個嚴重限制是索引(包括唯一約束)和外鍵約束僅適用於單個表,不適用於它們的繼承子級

我想我找到了解決方法。 我只是像這樣將參考移到了父項中

DROP SCHEMA PUBLIC CASCADE;
CREATE SCHEMA PUBLIC;

CREATE TABLE student(
   studentId SERIAL PRIMARY KEY,
   age INT,
   friend INT REFERENCES student (studentId)
);

CREATE TABLE engineer(
   id SERIAL PRIMARY KEY
) INHERITS (student);

CREATE TABLE artist(
   id SERIAL PRIMARY KEY
) INHERITS (student);

INSERT INTO engineer (id,age) VALUES (DEFAULT,20);
INSERT INTO artist (id,age,friend) VALUES (DEFAULT,20,1);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM