我正在尝试创建之前删除的表。
但是当我做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)
);
答案 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 SEQUENCE
中IF 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
之后运行它。因此,您可能是第二次创建表,而第一次尝试已经创建了它。