我已经创建了三个表(用户,候选人和投票),当用户创建投票时,会将其发送到具有来自候选人表的外键候选的投票表,但是当我创建新的投票时,我收到此错误
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)
);
答案 0 :(得分:1)
用户 6个存在,但您只有五个候选,其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)
);
我会推荐这个。如果您作为数据库设计者已经对“候选人”和“用户”之间的区别感到困惑,那么毫无疑问,将来数据库的用户也会有同样的困惑。
答案 1 :(得分:0)
该信息非常清楚,您的候选表中不包含id=6
,但是您试图将该值插入votes
表中,这就是您收到错误的原因,因为它是外键冲突
在votes
表candidate INTEGER REFERENCES candidates(id)
中,这与candidates
表id
列相关,与您认为的candidate
列无关