如何在 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
);

一个选项是同时执行 insertupdate 的单个语句:

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);

另一种是使用分配值的触发器。