我有一个包含多个列的表,并希望INSERT使用RETURNING. 不幸的是,在这种情况下,我似乎必须指定所有列
INSERT INTO "user" ( "id", ... ) VALUES ( DEFAULT, ... ) RETURNING "id"
而不仅仅是做
INSERT INTO "user" VALUES ( DEFAULT, ... ) RETURNING "id"
这使得查询非常长而且相当不可读。我可以在不指定每一列的情况下以某种方式返回 ID 吗?
我有一个包含多个列的表,并希望INSERT使用RETURNING. 不幸的是,在这种情况下,我似乎必须指定所有列
INSERT INTO "user" ( "id", ... ) VALUES ( DEFAULT, ... ) RETURNING "id"
而不仅仅是做
INSERT INTO "user" VALUES ( DEFAULT, ... ) RETURNING "id"
这使得查询非常长而且相当不可读。我可以在不指定每一列的情况下以某种方式返回 ID 吗?
当然可以。您的第二个查询应该可以正常工作-前提是id实际上在表中具有第一个位置-我对此表示怀疑。
验证:
SELECT attnum
FROM pg_attribute
WHERE attrelid = '"user"'::regclass
AND attname = 'id';
但这并不意味着你应该这样做。除了临时调用之外,只有少数情况下您不应该将列列表附加到INSERT命令中。
无论哪种方式,您都不应该使用像表名这样的保留字。user这是一个非常糟糕的主意。装填脚枪的经典案例。
我无法重现该问题。我正在运行 PostgreSQL 9.1 版,创建了一个users包含列id和name.
然后我运行了这个查询:
INSERT INTO users VALUES(DEFAULT,'jszobody') RETURNING id
我id没有在 INSERT 查询中指定列就得到了回复。它似乎刚刚奏效。
你遇到了什么错误?什么版本的 PostgreSQL?您是否尝试过在这样一个非常简单的测试用例中重现,排除查询、默认值等的任何其他问题?