我创建了三个表(用户、候选人和投票),当用户创建投票时,它会被发送到投票表,该投票表具有候选人表中的外键候选人,但是当我创建新投票时,我收到此错误
ERROR: insert or update on table "votes" violates foreign key constraint "votes_candidate_fkey"
DETAIL: Key (candidate)=(6) is not present in table "candidates".
候选人表中有id为6的候选人,但是当我创建投票时出现外键错误,我该如何解决这个问题,下面是shema
CREATE TABLE IF NOT EXISTS users(
id serial PRIMARY KEY,
first_name VARCHAR (100) NOT NULL,
last_name VARCHAR (100) NOT NULL,
other_name VARCHAR (100) NOT NULL,
email VARCHAR (100) UNIQUE NOT NULL,
password VARCHAR (100) NOT NULL,
phone_Number VARCHAR (100) UNIQUE NOT NULL,
passport_Url VARCHAR (255) NOT NULL,
is_Admin BOOLEAN DEFAULT 'no'
);
CREATE TABLE IF NOT EXISTS candidates(
id serial PRIMARY KEY,
office INTEGER REFERENCES offices(id),
party INTEGER REFERENCES parties(id),
candidate INTEGER UNIQUE REFERENCES users(id)
);
CREATE TABLE IF NOT EXISTS votes(
created_by INTEGER REFERENCES users(id),
office INTEGER REFERENCES offices(id),
candidate INTEGER REFERENCES candidates(id),
created_On DATE NOT NULL DEFAULT NOW(),
PRIMARY KEY (office, created_By)
);
最佳答案
用户 6 存在,但您只有 5 个候选人,他们的 ID 分别为 1、2、3、4 和 5。
您的外键是 id
,而不是 candidate
列:
candidate INTEGER REFERENCES candidates(id),
----------------------------------------^
对于用户 6,适当的 ID 是 5。
您可能需要设置主键为用户 ID 的候选表(即,候选者是用户的子集)。如果是这样,请删除 serial
列:
CREATE TABLE IF NOT EXISTS candidates(
candidate INTEGER PRIMARY KEY REFERENCES users(id),
office INTEGER REFERENCES offices(id),
party INTEGER REFERENCES parties(id)
);
我会推荐这个。如果您作为数据库设计者已经对“候选人”和“用户”之间的区别感到困惑,那么毫无疑问 future 的数据库用户也会有同样的困惑。
关于sql - 如何修复这个 PostgreSQL 外键错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55026886/