当前位置: 首页 > 知识库问答 >
问题:

使用插入。。。在冲突时不执行任何操作返回失败的行

奚瑾瑜
2023-03-14

假设我有下表:

CREATE TABLE tags (
    id int PK,
    name varchar(255),
    CONSTRAINT name_unique UNIQUE(name)
)

我需要一个查询,将插入不存在的标签,并返回所有请求的标签ID。考虑以下事项:

INSERT INTO tags (name) values ('tag10'), ('tag6'), ('tag11') ON CONFLICT DO NOTHING returning id, name

此查询的输出是:

+---------------+
|  id   |  name |
|---------------|
|  208  | tag10 |
|---------------|
|  209  | tag11 |
+---------------+

我需要的是在输出中有tag6

共有2个答案

龚永新
2023-03-14

与此表:

CREATE TABLE tags (
    id serial PRIMARY KEY,
    name text UNIQUE
);

只要此查询是唯一的,解决方案中的值就很长:

INSERT INTO tags (name) 
VALUES ('tag10'), ('tag6'), ('tag11') 
ON CONFLICT DO UPDATE name = EXCLUDED.name RETURNING id, name;
赫连鸿振
2023-03-14

有点罗嗦,但我想不出其他任何东西:

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;

标签中进行外部选择可以看到插入新标签之前表格的快照。带有常量的第三列仅用于测试查询,以便识别插入了哪些行和未插入哪些行。

 类似资料:
  • 在PostgreSQL 9.5中出现了冲突更新/无操作功能。创建服务器和外部表将在PostgreSQL 9.2版本中出现。 当我对外部表使用ON CONFLICT DO UPDATE时,它不起作用,但当我对普通表运行相同的查询时,它起作用。下面给出了问题。 //对于普通表 O/P:查询成功返回:一行受影响,执行时间为5毫秒。 //对于外部表概念 //foreign_app为foreign tabl

  • 问题内容: 我有一个带有两列唯一键的表: 我想在该表中插入一行,但是如果键存在,则什么也不做!我不希望因为键存在而产生错误。 我知道有以下语法: 但是是否有类似的东西: ? 问题答案: 是的,使用(即使已分配给自身,它也不会触发行更新)。 如果您不关心错误(转换错误,外键错误)和自动递增字段用尽(即使由于重复键而未插入行,它也会增加),请使用。

  • 我想在Postgres中使用单个insert语句插入多行。 这里的问题是,如果单行插入失败,则所有其他成功的插入都将被回滚。有没有办法避免回滚并使查询返回失败行的列表。 否则,我会编写一个insert语句的循环。我正在使用节点pg模块。如果postgres不支持,有没有推荐的方法来达到我的要求? 编辑-1 完成上述查询后,select 语句返回 0 行。我正在寻找一个解决方案,其中插入前两行。

  • 我试图通过设置服务器身份验证将本地文件加载到bigquery。我已经完成了以下步骤 > gcloud auth激活服务帐户命令 使用登录 gcloud身份验证登录 正在尝试执行python脚本以将文件上载到BigQuery 范围= 结果是 但我有足够的权限创建查询作业 我错过了什么?我以为我已经登录了。

  • 我正在尝试通过NIFI从oracle数据库中提取数据。在画布中,我将文件大小为0 KB的“GenerateFlowFile”处理器安排为每5分钟运行一次。这只是为了在成功时触发“executesql”处理器。对于“executeSQL”,我将DB连接池服务设置为DBCPConnectionPool。我输入SQL查询“select*FROM sometable”。我的DBCPConnectionPo

  • 错误:任务“:app:PreDebugandroidTestBuild”执行失败。 与项目':app'中的依赖项'com.android.support:support-annotations'冲突。应用程序(26.1.0)和测试应用程序(27.1.1)的解析版本不同。有关详细信息,请参见https://d.android.com/r/tools/test-apk-dependency-confl