关系“table”已经存在。

3

我正在构建一个SQL数据库,但遇到了“关系‘sexes’已存在”的错误。

根据发布类似问题的SO用户的帖子,我尝试过:注释掉约束条件以查看是否有干扰、更改所有序列/所有主键引用为整数以匹配类型、如果它们存在,则删除所有表。无论我做什么,错误仍然是相同的,因此我已经发布了我的原始代码。我真的需要一些指导,以确定这种情况的问题所在。谢谢!

CREATE TABLE sexes (
  id                serial PRIMARY KEY,
  string            text NOT NULL
);

CREATE TABLE humans (
  id                serial PRIMARY KEY UNIQUE NOT NULL,
  forename          text NOT NULL,
  surname           text NOT NULL,
  birthdate         date,
  sex_id            integer REFERENCES sexes(id)
);

CREATE TABLE marriages (
  id                serial PRIMARY KEY UNIQUE NOT NULL,
  partner_1_id      integer REFERENCES humans(id),
  partner_2_id      integer REFERENCES humans(id),
  marriage_date     date NOT NULL,
  divorce_date      date NOT NULL,
  CONSTRAINT divorced CHECK (marriage_date <= divorce_date),
  CONSTRAINT marry_self CHECK (partner_1_id <> partner_2_id) 
);
1个回答

4
你可以使用IF NOT EXISTS子句:

如果已经存在同名关系,则不会抛出错误,而是发出一个提示。请注意,无法保证现有的关系与将要创建的关系相似。

CREATE TABLE IF NOT EXISTS sexes (
  id                serial PRIMARY KEY,
  string            text NOT NULL
);

如果之前存在表格,删除它们后再创建新表会出现全新的错误,这真的很奇怪。如果你想删除表格,必须按照正确的顺序进行:
DROP TABLE IF EXISTS marriages;
DROP TABLE IF EXISTS humans;
DROP TABLE IF EXISTS sexes;

谢谢,伙计。我想这就解决了!这真的很奇怪,因为如果在创建新表之前删除已存在的表,则会出现全新的错误。 - Ryan
这绝对解决了问题,但随后,“如果不存在则创建”在脚本的后面开始抛出其他重复/唯一值错误(我听说过PostgreSQL会失步,不确定是否是这种情况)。按正确顺序删除表是最好的选择。 - Ryan
PostgreSQL不会失去同步。像pgAdmin这样的图形客户端在执行此类操作时可能会失去同步,因此请使用刷新功能将其恢复同步。 - Eelke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接