0

我有下表:

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

是否可能在一个声明中?

4

2 回答 2

1

听起来您想将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);

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

于 2021-01-19T11:50:23.683 回答
0

使用INSERT INTO .. SELECT如下:

INSERT INTO tab(code, data) 
select 'code: ' || id::TEXT, 'my data' from tab;

注意:在新添加的数据中(插入上方),您缺少添加 id 列数据,或者我认为它是自动生成的。

于 2021-01-19T10:50:31.620 回答