postgresql表上的插入或更新违反外键约束

46scxncf  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(1071)

我是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
)
ztyzrc3y

ztyzrc3y1#

在难度表中需要一个id为9的对应条目,以便在问题表中有一个引用id\难度列。
例如,如果难度表包含:

id |      name      
----+----------------
  1 | easy
  2 | reasonable
  3 | difficult
  4 | very difficult
  5 | impossible

您只能将问题表中的行的id值设置为这些id值之一。如果设置6、12或1到5以外的任何值,则会失败,因为这些值受外键中的值的约束。
这个 id_difficulty , id_category 以及 id_creator 列不应使用 serial ,因此应删除它们的默认值:

ALTER TABLE question ALTER COLUMN id_difficulty DROP DEFAULT;
ALTER TABLE question ALTER COLUMN id_category DROP DEFAULT;
ALTER TABLE question ALTER COLUMN id_creator DROP DEFAULT;
64jmpszr

64jmpszr2#

postgres现在建议使用 generated always as 而不是 serial . 如果这样做,那么类型将更加简单地对齐:

CREATE TABLE question (
  id int generated always as identity PRIMARY KEY,
  text varchar,
  correct_answer varchar,
  incorrect_answer1 varchar,
  incorrect_answer2 varchar,
  incorrect_answer3 varchar,
  id_difficulty int REFERENCES difficulty(id),
  id_category int REFERENCES category (id),
  id_creator int REFERENCES game (id)
);

CREATE TABLE difficulty (
  id int generated always as identity PRIMARY KEY,
  name varchar
);

这使得正在发生的事情更加清楚。外键引用的数据类型需要与主键的数据类型匹配。博士后知道这一点 serial 是真的吗 int . 但是使用 generated always 显然,它们是相同的。
此外, generated always as 更符合标准sql。

相关问题