Sql 使用RETURNING而不显式命名列

Sql 使用RETURNING而不显式命名列,sql,postgresql,database-design,sql-insert,Sql,Postgresql,Database Design,Sql Insert,我有一个包含多个列的表,希望使用RETURNING从INSERT查询返回id。不幸的是,在这种情况下,我似乎必须指定所有列 INSERT INTO "user" ( "id", ... ) VALUES ( DEFAULT, ... ) RETURNING "id" 而不仅仅是做 INSERT INTO "user" VALUES ( DEFAULT, ... ) RETURNING "id" wich使得查询非常长,而且不可读。我是否可以在不指定每一列的情况下以某种方式返回ID?我无法重现

我有一个包含多个列的表,希望使用
RETURNING
INSERT
查询返回id。不幸的是,在这种情况下,我似乎必须指定所有列

INSERT INTO "user" ( "id", ... ) VALUES ( DEFAULT, ... ) RETURNING "id"
而不仅仅是做

INSERT INTO "user" VALUES ( DEFAULT, ... ) RETURNING "id"

wich使得查询非常长,而且不可读。我是否可以在不指定每一列的情况下以某种方式返回ID?

我无法重现该问题。我正在运行PostgreSQL 9.1版,创建了一个简单的
users
表,其中包含
id
name

然后我运行了这个查询:

将返回id的值插入用户值(默认值为'jszobody')

我得到了
id
,但没有在INSERT查询中指定列。这似乎刚刚奏效

你犯了什么错误?什么版本的PostgreSQL?您是否尝试过在这样一个非常简单的测试用例中复制,排除了查询、默认值等的任何其他问题?

当然可以。如果
id
在表中实际有第一个位置,那么您的第二个查询应该可以正常工作,我对此表示怀疑

核实:

SELECT attnum
FROM   pg_attribute
WHERE  attrelid = '"user"'::regclass
AND    attname = 'id';
但这并不意味着你应该这么做。除了临时调用,只有少数情况下不应将列列表附加到
INSERT
命令


无论哪种方式,都不应该使用like
用户
作为表名。那是个非常糟糕的主意。一把装有子弹的脚踏枪的经典案例。

这很奇怪。产生错误的一定是其他原因(可能是查询中的不可见字符或类似的原因)。在重写整个查询字符串后,它确实可以在不指定列的情况下工作。