【问题标题】:Relation "table" already exists关系“表”已存在
【发布时间】:2017-11-19 17:12:37
【问题描述】:

我正在构建一个 SQL 数据库并遇到错误“关系‘性别’已经存在”。

对于发布类似问题的每个 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) 
);

【问题讨论】:

    标签: sql postgresql atom-editor


    【解决方案1】:

    您可以使用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 请检查我的编辑,如果您的问题得到解决,请考虑接受答案(How does accepting an answer work?)。
    • 这确实解决了问题,但作为后续,“如果不存在则创建”开始在脚本中进一步抛出其他重复/唯一值错误(我听说 PostgreSQL 退出同步,不确定是否是这种情况)。以正确的顺序删除表格是最好的选择。
    • PostgreSQL 不会不同步。当您执行此类操作时,像 pgAdmin 这样的图形客户端确实会不同步,因此请使用刷新功能使其恢复同步。
    猜你喜欢
    • 2015-07-02
    • 2021-11-04
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    • 2018-04-07
    相关资源
    最近更新 更多