PostgreSQL错误:关系已经存在

时间:2012-01-09 17:55:59

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

9 个答案:

答案 0 :(得分:30)

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

答案 1 :(得分:12)

此处不应有单引号 'A' 。单引号用于字符串文字:'some value' 使用双引号来保留大写拼写“A”:

CREATE TABLE "A" ...

或根本不使用引号:

CREATE TABLE A ...

相同
CREATE TABLE a ...

因为所有未加引号的标识符都是folded to lower case automatically in PostgreSQL


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

CREATE TABLE csd_relationship (
    csd_relationship_id serial PRIMARY KEY,
    type_id integer NOT NULL,
    object_id integer NOT NULL
);

与原始查询相同,只是它可以自动避免命名冲突。它会自动选择下一个免费标识符。有关serial type in the manual的更多信息。

答案 2 :(得分:7)

您无法创建名称与群集中现有表或视图相同的表。要修改现有表格,请使用ALTER TABLE (link),或者删除当前表格中的所有数据并创建包含所需架构的空表格,在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;
在其余的架构更新之前

;如果不明显,这将删除csd_relationship表格中的所有数据,如果有的话

答案 3 :(得分:3)

就我而言,我有一个同名的序列。

答案 4 :(得分:2)

在我的情况下,直到我暂停批处理文件并向上滚动一点,这不是我得到的唯一错误。我的DROP命令变为DROP,因此表格首先没有下降(因此关系确实仍然存在)。我学到的称为字节顺序标记(BOM)。在Notepad ++中打开它,将没有BOM的Encoding设置为UTM-8的SQL文件重新保存,运行正常。

答案 5 :(得分:2)

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

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

答案 6 :(得分:1)

有时,当您使用其他数据库用户创建表并尝试使用其他用户SELECT时,会发生这种错误。 您可以使用以下查询授予所有特权。

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA schema_name TO username;

您还可以授予DML语句访问权限

GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA schema_name TO username;

答案 7 :(得分:0)

在我的情况下,我从9.5迁移到9.6。 因此,为了恢复数据库,我正在做:

[]

当然它在旧的postgreSQL数据库上执行,其中有数据!如果您的新实例位于端口5433上,则正确的方法是:

sudo -u postgres psql -d databse -f dump.sql

答案 8 :(得分:0)

您可能在运行 CREATE TABLE 之后运行它。因此,您可能是第二次创建表,而第一次尝试已经创建了它。