在不明确命名列的情况下使用RETURNING

时间:2013-03-30 15:14:25

标签: sql postgresql database-design sql-insert

我有一个包含多个列的表,并希望使用INSERTRETURNING查询中返回ID。不幸的是,在这种情况下,我必须指定所有列

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

而不只是做

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

这使得查询非常长而且难以理解。我可以在不指定每一列的情况下以某种方式返回ID吗?

2 个答案:

答案 0 :(得分:2)

当然你可以。你的第二个查询应该可行 - 只要id实际上是表中的第一个位置 - 我怀疑。

验证:

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

并不意味着你应该这样做。除了临时调用之外,只有少数情况下将列列表附加到INSERT命令。

无论哪种方式,您都不应该使用reserved word之类的user作为表名。这是一个非常糟糕的主意。装载脚枪的经典案例。

答案 1 :(得分:0)

我无法重现这个问题。我正在运行PostgreSQL 9.1版,创建了一个包含usersid列的简单name表。

然后我运行了这个查询:

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

我在没有指定INSERT查询中的列的情况下返回了id。它似乎刚刚起作用。

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