首页 > 解决方案 > 如何修复此 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)
  );

标签: sqlpostgresql

解决方案


用户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)
);

我会推荐这个。如果您作为数据库设计者已经对“候选人”和“用户”之间的区别感到困惑,那么毫无疑问,未来的数据库用户也会有同样的困惑。


推荐阅读