如何解决PostgreSQL外键错误?

时间:2019-03-06 15:39:39

标签: 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)
  );

2 个答案:

答案 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表中,这就是您收到错误的原因,因为它是外键冲突

votescandidate INTEGER REFERENCES candidates(id)中,这与candidatesid列相关,与您认为的candidate列无关