sql - 如何在 postgres 插入查询中引用另一列?
问题描述
我有下表:
CREATE TABLE tab (
id SERIAL PRIMARY KEY,
code TEXT NOT NULL,
data TEXT
)
在某些情况下,我想插入一个新行,确保代码列由 id 列生成。在其他情况下,code
由用户提供。
例如:
INSERT INTO tab(code, data) VALUES ('code: ' || id::TEXT, 'my data');
预期的结果是这样的:
ID | 代码 | 数据 |
---|---|---|
1 | 代码:1 | 美国广播公司 |
2 | 代码:2 | xyz |
INSERT INTO tab(code, data) VALUES ('user.provided.code', 'my data');
预期的结果是这样的:
ID | 代码 | 数据 |
---|---|---|
1 | 代码:1 | 美国广播公司 |
2 | 代码:2 | xyz |
3 | user.provided.code | xyz |
是否可能在一个声明中?
解决方案
听起来您想将coder
基于id
. 不幸的是,这在 Postgres 中不起作用:
create table tab (
id integer primary key generated always as identity,
code text not null default ('code '||id::text),
data text
);
一种选择是同时执行 aninsert
和的单个语句update
:
with i as (
insert into tab (code, data)
values ('', 'my data'
returning *
)
update tab
set code = 'code: ' || id::TEXT
where tab.id in (select i.id from i);
另一种是使用分配值的触发器。