首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在冲突“酷名”-->“酷名1”上增加文本列

在冲突“酷名”-->“酷名1”上增加文本列
EN

Stack Overflow用户
提问于 2019-11-20 21:23:58
回答 1查看 110关注 0票数 4

我在表上有一个唯一的列display_name。在插入新行时,我希望执行以下ON CONFLICT (display_name)操作:向display_name值追加一个数字,使其现在是唯一的。

例如在postgres 10中,

代码语言:javascript
复制
CREATE TABLE some_table (
  id SERIAL NOT NULL PRIMARY KEY,
  display_name text UNIQUE
);

INSERT INTO some_table (display_name) VALUES ('cool name');

INSERT INTO some_table (display_name) VALUES ('cool name')
  ON CONFLICT (display_name) ....
  -- 'cool name' is a duplicate here, can I somehow increment a suffix
  -- here until it is a unique value (like 'cool name 1')?
EN

回答 1

Stack Overflow用户

发布于 2019-11-20 22:35:18

不可能在ON CONFLICT子句中插入行(只能更新现有行),因此不能使用该构造。使用plpgsql,例如:

代码语言:javascript
复制
do $$
declare new_str text := 'cool name';
begin   
    insert into some_table (display_name)
    values (new_str);
exception when unique_violation then
    insert into some_table (display_name)
    select format('%s %s',
        new_str,
        (select coalesce(nullif(regexp_replace(display_name, '^.*?(\d+)$', '\1'), display_name), '0')::int+ 1
        from some_table
        where left(display_name, length(new_str)) = new_str
        order by 1 desc
        limit 1)
    );
end $$;

db<>fiddle.现场演示

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58963597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档