2013-03-30 32 views
1

我有一个表格,列数超过了几列,并且想要使用RETURNING返回INSERT查询的ID。不幸的是,似乎在这种情况下,我必须指定所有列在没有明确命名列的情况下使用RETURNING

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

,而不是仅仅做

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

至极使得查询非常长,而无法读取。我能否以某种方式返回ID而不指定每一列?

回答

2

当然你可以。你的第二个查询应该是正常的 - 假设id实际上是表中的第一个位置 - 我怀疑它。

与验证:

SELECT attnum 
FROM pg_attribute 
WHERE attrelid = '"user"'::regclass 
AND attname = 'id'; 

并不意味着你应该它,虽然。除了临时呼叫之外,只有少数情况下,您应该将而不是附加列表列表给INSERT命令。

无论哪种方式,你都不应该使用reserved word,比如user作为表名。这是一个非常糟糕的主意。一个经典的装载脚踏枪的情况。

0

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

我然后跑这个查询:

INSERT INTO users VALUES(DEFAULT,'jszobody') RETURNING id

我得到了id回而不在INSERT查询中指定的列。它似乎刚刚工作。

你有什么错误?什么版本的PostgreSQL?你有没有试过在这样一个非常简单的测试案例中进行再现,排除了查询,默认值等其他问题?

+0

这很奇怪。它一定是别的东西(可能是查询中的无用字符或类似的东西),这会产生错误。在我重写了整个查询字符串后,它确实没有指定列。 –

相关问题