我是posgresql的新手。我有5个表,我正在尝试插入属性表。当我第二次尝试插入时,“pgadmin”中出现此错误。 ERROR: insert or update on table "question" violates foreign key constraint "question_id_difficulty_fkey" DETAIL: Key (id_difficulty)=(9) is not present in table "difficulty". SQL state: 23503.
我的模式在这里
id SERIAL PRIMARY KEY,
name varchar
);
CREATE TABLE question (
id SERIAL PRIMARY KEY,
text varchar,
correct_answer varchar,
incorrect_answer1 varchar,
incorrect_answer2 varchar,
incorrect_answer3 varchar,
id_difficulty SERIAL REFERENCES difficulty(id),
id_category SERIAL REFERENCES category (id),
id_creator SERIAL REFERENCES game (id)
);
CREATE TABLE difficulty (
id SERIAL PRIMARY KEY,
name varchar
);
CREATE TABLE category (
id SERIAL PRIAMRY KEY,
name varchar
);
CREATE TABLE user (
id SERIAL PRIMARY KEY,
name varchar
)
2条答案
按热度按时间ztyzrc3y1#
在难度表中需要一个id为9的对应条目,以便在问题表中有一个引用id\难度列。
例如,如果难度表包含:
您只能将问题表中的行的id值设置为这些id值之一。如果设置6、12或1到5以外的任何值,则会失败,因为这些值受外键中的值的约束。
这个
id_difficulty
,id_category
以及id_creator
列不应使用serial
,因此应删除它们的默认值:64jmpszr2#
postgres现在建议使用
generated always as
而不是serial
. 如果这样做,那么类型将更加简单地对齐:这使得正在发生的事情更加清楚。外键引用的数据类型需要与主键的数据类型匹配。博士后知道这一点
serial
是真的吗int
. 但是使用generated always
显然,它们是相同的。此外,
generated always as
更符合标准sql。