sql - 如何修复此 PostgreSQL 外键错误?
问题描述
我创建了三个表(用户、候选人和投票),当用户创建投票时,它被发送到投票表,其中包含候选人表中的外键候选人,但是当我创建新投票时,我得到了这个错误
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 存在,但您只有五个候选人,他们的 id 是 1、2、3、4 和 5。
您的外键是 to 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)
);
我会推荐这个。如果您作为数据库设计者已经对“候选人”和“用户”之间的区别感到困惑,那么毫无疑问,未来的数据库用户也会有同样的困惑。
推荐阅读
- javascript - 静态三角图的逻辑
- javascript - 跟踪对同一元素的多次点击
- java - Spring Security 仅使用用户名登录并设置角色而不使用密码
- react-native - 在 react-native post 中获取错误响应和空数据数组将数据保存到服务器
- java - YML 到 XML JAVA 对象转换
- r - 将因子 ddmmyyyy:ss:mm:hh 转换为 R 中的 ddmmyyyy 格式
- python - CV2 在一段时间后开始拍摄 emty 图像
- button - 当在颤动上按下一个时,使所有其他小部件平面按钮改变颜色
- mysql - 当列名称为日期且列数据类型为日期和时间时,MYSQL Order by Clause 不适用于货币表
- ios - 如何将 JSON 对象插入到数组中?