sql - 如何修复这个 PostgreSQL 外键错误?

标签 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".

enter image description here

候选人表中有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/

相关文章:

postgresql - PostgreSQL sql 文件中的占位符

mysql - mysql连接问题

sql - 在 SQL 中加入最接近的日期

mysql - 使用单个查询从两个表中选择帖子及其所有标签

postgresql - 如何在 PostgreSQL 中自动递增?

django - 具有多种变体的产品

java - ZoneDateTime在PostgreSQL中存储为JSONB的序列化格式

mysql - 比较来自同一表和列的两组数据,而无需在 MySQL 中两次调用表

sql - 无法使用 monotouch 连接到 sql azure 数据库

sql - 按事件和非事件日期计算单位数