PostgreSQL错误:关系已经存在

nsb*_*sbm 42 postgresql identifier create-table

我正在尝试创建一个之前删除的表.

但是当我这样做的时候CREATE TABLE A ...我收到以下错误:

关系'A'已经存在.

我验证了SELECT * FROM A,但后来又出现了另一个错误:

关系'A'不存在.

我已经试图在\dS+列出所有关系时找到它,但它并不存在.
为了使这一点复杂化,我通过在另一个数据库中创建此表来测试这个,我得到了同样的错误.我认为这个表被删除时可能会出错.有任何想法吗?

这是代码:我正在使用Power SQL生成的代码.我没有使用序列有相同的错误.它只是在我更改名称时起作用,在这种情况下我不能这样做.

CREATE SEQUENCE csd_relationship_csd_relationship_id_seq;
CREATE TABLE csd_relationship (
    csd_relationship_id INTEGER NOT NULL DEFAULT nextval('csd_relationship_csd_relationship_id_seq'::regclass),  
    type_id INTEGER NOT NULL,
    object_id INTEGER NOT NULL,
    CONSTRAINT csd_relationship PRIMARY KEY (csd_relationship_id)
);
Run Code Online (Sandbox Code Playgroud)

nsb*_*sbm 36

我终于发现了这个错误.问题是主键约束名称与表名称相同.我不知道postgres如何表示约束,但我认为在创建主键约束期间会触发错误"Relation already exists",因为已经声明了表.但是由于这个错误,表格最终没有创建.

  • 我遇到了类似的问题.外键约束名称在整个pg数据库中共享,因此通过复制粘贴一些命令,我​​最终尝试创建一个与之前创建的fk约束相同的fk约束(对于另一个表),它抛出了相同的"Relation ___"存在"错误并带我到这里...... +1 :) (2认同)
  • 您可以添加正确重命名的东西/语法的简短代码示例吗 (2认同)

Erw*_*ter 14

这里不应该有单引号'A'.单引号用于字符串文字:'some value'.
使用双引号来保留"A"的大写拼写:

CREATE TABLE "A" ...
Run Code Online (Sandbox Code Playgroud)

或者根本不使用引号:

CREATE TABLE A ...
Run Code Online (Sandbox Code Playgroud)

这与...完全相同

CREATE TABLE a ...
Run Code Online (Sandbox Code Playgroud)

因为所有的未引用的标识符折叠以在PostgreSQL自动小写.


您可以使用更简单的语法完全避免索引名称的问题:

CREATE TABLE csd_relationship (
    csd_relationship_id serial PRIMARY KEY,
    type_id integer NOT NULL,
    object_id integer NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

与原始查询相同,只是它会自动避免命名冲突.它会自动选择下一个免费标识符.有关手册中序列类型的更多信息.


Sin*_*ion 7

您无法创建名称与群集中的现有表或视图相同的表.要修改现有表,请使用ALTER TABLE(链接),或删除当前表中的所有数据,并创建一个包含所需模式的空表,DROP TABLE然后再发出问题CREATE TABLE.

可能是你创建的序列是罪魁祸首.在PostgreSQL中,序列被实现为具有特定列集的表.如果已经定义了序列,则应该跳过创建它.不幸的是,在可用CREATE SEQUENCEIF NOT EXISTS构造中没有等价物CREATE TABLE.从它的外观来看,无论如何,你可能无条件地创建你的模式,所以使用它是合理的

DROP TABLE IF EXISTS csd_relationship;
DROP SEQUENCE IF EXISTS csd_relationship_csd_relationship_id_seq;
Run Code Online (Sandbox Code Playgroud)

在其余的架构更新之前; 如果不明显,这将删除csd_relationship表中的所有数据,如果有的话


ise*_*rds 5

您可能会收到“关系已存在”之类的错误的另一个原因是DROP命令未正确执行。

发生这种情况的原因之一是,如果有其他会话连接到数据库,您需要先关闭这些会话。