如何在 postgres 插入查询中引用另一列?
how can I reference another column inside postgres insert query?
我有以下 table:
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
code
data
1
code: 1
abc
2
code: 2
xyz
INSERT INTO tab(code, data) VALUES ('user.provided.code', 'my data');
预期结果类似于:
id
code
data
1
code: 1
abc
2
code: 2
xyz
3
user.provided.code
xyz
是否可以在一个语句中实现?
使用INSERT INTO .. SELECT
如下:
INSERT INTO tab(code, data)
select 'code: ' || id::TEXT, 'my data' from tab;
注意:在新添加的数据中(上面的插入),您缺少添加id列数据或者我认为它是自动生成的。
听起来您想将 coder
默认设置为基于 id
的内容。不幸的是,这在 Postgres 中不起作用:
create table tab (
id integer primary key generated always as identity,
code text not null default ('code '||id::text),
data text
);
一个选项是同时执行 insert
和 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);
另一种是使用分配值的触发器。
我有以下 table:
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 | code | data |
---|---|---|
1 | code: 1 | abc |
2 | code: 2 | xyz |
INSERT INTO tab(code, data) VALUES ('user.provided.code', 'my data');
预期结果类似于:
id | code | data |
---|---|---|
1 | code: 1 | abc |
2 | code: 2 | xyz |
3 | user.provided.code | xyz |
是否可以在一个语句中实现?
使用INSERT INTO .. SELECT
如下:
INSERT INTO tab(code, data)
select 'code: ' || id::TEXT, 'my data' from tab;
注意:在新添加的数据中(上面的插入),您缺少添加id列数据或者我认为它是自动生成的。
听起来您想将 coder
默认设置为基于 id
的内容。不幸的是,这在 Postgres 中不起作用:
create table tab (
id integer primary key generated always as identity,
code text not null default ('code '||id::text),
data text
);
一个选项是同时执行 insert
和 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);
另一种是使用分配值的触发器。