首页 > 解决方案 > 如何在 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

是否可能在一个声明中?

标签: sqlpostgresqlsql-insertinsert-query

解决方案


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

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


推荐阅读