nic*_*ted 1 postgresql postgresql-9.5
假设我有下表:
CREATE TABLE tags (
id int PK,
name varchar(255),
CONSTRAINT name_unique UNIQUE(name)
)
Run Code Online (Sandbox Code Playgroud)
我需要一个查询,它将插入不存在的标记,并为所有请求的标记返回id.考虑以下:
INSERT INTO tags (name) values ('tag10'), ('tag6'), ('tag11') ON CONFLICT DO NOTHING returning id, name
Run Code Online (Sandbox Code Playgroud)
此查询的输出是:
+---------------+
| id | name |
|---------------|
| 208 | tag10 |
|---------------|
| 209 | tag11 |
+---------------+
Run Code Online (Sandbox Code Playgroud)
我需要的是tag6输出.
有点冗长,但我想不出别的:
with all_tags (name) as (
values ('tag10'), ('tag6'), ('tag11')
), inserted (id, name) as (
INSERT INTO tags (name)
select name
from all_tags
ON CONFLICT DO NOTHING
returning id, name
)
select t.id, t.name, 'already there'
from tags t
join all_tags at on at.name = t.name
union all
select id, name, 'inserted'
from inserted;
Run Code Online (Sandbox Code Playgroud)
外部选择可以tags看到表格的快照,就像插入新标签之前一样.带常量的第三列仅用于测试查询,以便可以识别插入的行和不插入的行.
| 归档时间: |
|
| 查看次数: |
3023 次 |
| 最近记录: |