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",因为已经声明了表.但是由于这个错误,表格最终没有创建.
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)
与原始查询相同,只是它会自动避免命名冲突.它会自动选择下一个免费标识符.有关手册中序列类型的更多信息.
您无法创建名称与群集中的现有表或视图相同的表.要修改现有表,请使用ALTER TABLE(链接),或删除当前表中的所有数据,并创建一个包含所需模式的空表,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;
Run Code Online (Sandbox Code Playgroud)
在其余的架构更新之前; 如果不明显,这将删除csd_relationship表中的所有数据,如果有的话
| 归档时间: |
|
| 查看次数: |
91344 次 |
| 最近记录: |