具有多个约束的 PostgreSQL 更新插入

2024-04-11

我正在尝试在有两个约束的表上进行更新插入。一种是a列是唯一的,另一种是b、c、d和e列一起是唯一的。我不想要的是 a、b、c、d 和 e 一起是唯一的,因为这将允许两行在 a 列中具有相同的值。

如果违反第二个约束(唯一的 b、c、d、e),则以下操作将失败:

INSERT INTO my_table (a, b, c, d, e, f, g)
SELECT (a, b, c, d, e, f, g)
FROM my_temp_table temp
ON CONFLICT (a) DO UPDATE SET
    a=EXCLUDED.a,
    b=EXCLUDED.b,
    c=EXCLUDED.c,
    d=EXCLUDED.d,
    e=EXCLUDED.e,
    f=EXCLUDED.f,
    g=EXCLUDED.g;

如果违反第一个约束(唯一的 a),则以下操作将失败:

INSERT INTO my_table (a, b, c, d, e, f, g)
SELECT (a, b, c, d, e, f, g)
FROM my_temp_table temp
ON CONFLICT ON CONSTRAINT my_table_unique_together_b_c_d_e DO UPDATE SET
    a=EXCLUDED.a,
    b=EXCLUDED.b,
    c=EXCLUDED.c,
    d=EXCLUDED.d,
    e=EXCLUDED.e,
    f=EXCLUDED.f,
    g=EXCLUDED.g;

我怎样才能把这两个结合在一起?我首先尝试定义一个约束,即“a 是唯一的,或者 b、c、d 和 e 一起是唯一的”,但看起来这是不可能的。然后,我尝试了两个带有 WHERE 子句的 INSERT 语句,以确保不会违反另一个约束,但在第三种情况下,一行可能同时违反两个约束。为了处理最后一种情况,我考虑删除其中一个约束并在 INSERT 之后创建它,但是没有更好的方法来做到这一点吗?

我尝试了这个,但根据 PostgreSQL 文档,它只能做任何事情:

INSERT INTO my_table (a, b, c, d, e, f, g)
SELECT (a, b, c, d, e, f, g)
FROM my_temp_table temp
ON CONFLICT DO UPDATE SET
    a=EXCLUDED.a,
    b=EXCLUDED.b,
    c=EXCLUDED.c,
    d=EXCLUDED.d,
    e=EXCLUDED.e,
    f=EXCLUDED.f,
    g=EXCLUDED.g;

我在另一个问题中读到,它可能可以在 PostgreSQL 15 中使用 MERGE,但遗憾的是它在 AWS RDS 上尚不可用。我需要找到一种使用 PostgreSQL 14 来做到这一点的方法。


我认为您需要的是稍微不同的设计。我认为“a”是代理键,b、c、d、e、f、g 构成自然键。我想还有其他列,那就是数据。

因此强制自动生成列“a”,如下所示:

CREATE TEMP TABLE my_table(
  a bigint GENERATED ALWAYS AS IDENTITY,
  b bigint NOT NULL,
  c bigint NOT NULL,
  d bigint NOT NULL,
  e bigint NOT NULL,
  f bigint NOT NULL,
  g bigint NOT NULL,
  data text,
  CONSTRAINT my_table_unique_together_b_c_d_e UNIQUE (b,c,d,e,f,g)
);

然后从插入中跳过 a 列:

INSERT INTO my_table (b, c, d, e, f, g)
SELECT (b, c, d, e, f, g)
FROM my_temp_table temp
ON CONFLICT ON CONSTRAINT my_table_unique_together_b_c_d_e DO UPDATE SET
  data=EXCLUDED.data;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有多个约束的 PostgreSQL 更新插入 的相关文章

  • MySQL/Postgres查询5分钟间隔数据

    我需要查询方面的帮助 假设这是表中的数据 timestamp 2010 11 16 10 30 00 2010 11 16 10 37 00 2010 11 16 10 40 00 2010 11 16 10 45 00 2010 11 1
  • Postgres 在转换时函数错误/失败时返回空值

    我正在尝试转换text价值观timestamp价值观 对于下表称为a id c1 1 03 03 2000 2 01 01 2000 3 12 4 1990 4 12 Sept 2011 5 12 1 1999 12 33 12 6 24
  • 适合从记录中提取 OneToMany 关系的约束编程

    也许有人可以帮助我解决 Prolog 或任何约束编程语言的问题 想象一个项目表 学生与母亲一起做某事的学校项目 每个项目都有一名或多名儿童参与 对于每个孩子 我们存储其姓名及其母亲的姓名 但对于每个项目 只有一个包含所有母亲的单元和一个包含
  • 在 postgres 中选择时保留顺序[重复]

    这个问题在这里已经有答案了 在 psql 中 至少在 v9 中 如果我这样做 select id from users where id in 2 1 1 and select id from users where id in 1 2 它
  • Django 全文搜索优化 - Postgres

    我正在尝试利用 Django v2 1 和 Postgres 9 5 创建一个地址自动完成功能的全文搜索 但性能目前不适合自动完成 我不明白逻辑我得到的绩效结果背后 就信息而言 该表相当大 有 1400 万行 我的型号 from djang
  • Postgres 重叠数组中的一列

    我有一个表 A 其中有一列 col1 其中每个记录都是整数数组 col1 1 2 3 4 1 2 6 7 1 2 3 8 9 我喜欢有一行作为结果 其中包含 col1 中所有数组的重叠或相交 select overlap col1 from
  • 在 Postgres 中以周为单位分割间隔

    这是另一个关于日期的 SQL 问题 我正在使用 PHP 和 Postgres 构建一个日历应用程序 它将显示几天 几周甚至几个月的事件 每个事件都有开始日期和结束日期 按范围选择它们不是问题 然而 如果 Postgres 可以在每周的第一天
  • “PG DuplicateTable:错误关系“产品”已存在”- Heroku db:迁移尝试

    Rails 菜鸟尝试将 DB 迁移到 Heroku 请原谅这个错误消息的多汁性 但我认为将其全部包含在内可能很重要 我不知道为什么会发生这种情况 也不知道这意味着什么 我的架构中只有一张产品表和一张创建产品迁移表 Migrating to
  • WHERE BETWEEN 子句中的 PostgreSQL jsonb 值

    我的数据库表 a table 中有 jsonb 字段 其中包含 int 值 例如 abc def ghk 500 我将使用 WHERE 子句创建带有此字段 ghk 过滤器的 SELECT SELECT FROM a table WHERE
  • PostgreSQL 触发器不返回任何内容

    我在创建时有一个 PostgreSQL 触发器 它基本上将插入重定向到子表中 插入记录后 我想中止请求以避免重复数据 据我所知 执行此操作的唯一方法是返回NULL在触发器中 问题是我需要返回记录才能获取 ID 如果我回来NULL 我得到 N
  • “psycopg2 的构建轮子失败” - 使用 virtualenv 和 pip 的 MacOSX

    我第一次尝试与其他几个人一起制作一个网站 在尝试使用 Django Python VirtualEnv 时遇到了一个奇怪的错误 我已经找到了针对其他操作系统 例如 Ubuntu 的此问题的解决方案 但找不到针对 Mac 的任何好的解决方案
  • Azure PostgreSQL 时间点还原不起作用

    我们在 Azure 中有一个 Postgre 数据库 但遇到了一个问题 表中的所有行都被删除 我们尝试使用 de azure 门户中的 时间点还原 选项 但创建的数据库与当前运行的数据库具有相同的数据 我们还尝试了其他日期和时间 数据库问题
  • 按名称删除 jsonb 数组项

    我有下表 CREATE TABLE country id INTEGER NOT NULL PRIMARY KEY name VARCHAR 50 extra info JSONB INSERT INTO country id extra
  • 使用 gin 索引和 sqlalchemy 返回排名搜索结果

    我为全文搜索设置了 GIN 索引 我想获取与搜索查询匹配的记录列表 按排名排序 记录与搜索查询的匹配程度 对于结果 我只需要记录及其列 不需要用于排序的实际排名值 我有以下查询 它运行良好并从我的 postgresql 数据库返回预期结果
  • 无法安装 psycopg2 Ubuntu

    试图为 django 项目准备好服务器 但我在设置 postgres 时遇到了一些问题 我正在遵循本指南 https jee appy blogspot com 2017 01 deply django with nginx html ht
  • Azure PostgreSQL 服务器服务排序规则创建错误

    我正在尝试将当前现有数据库导入到 Azure PostgreSQL 服务器上运行的 postgre 实例 我已经将我的azure postgresql服务器参数配置为使用UTF8编码 我不确定它是否在不重新启动的情况下应用 但即使我没有重新
  • UITableView 自动调整行大小约束在 iPhone 6Plus 上神秘破坏

    我有一个自定义的 UITableViewCell 它有一个缩略图和一堆文本 行高配置为使用自动计算 tableView estimatedRowHeight 129 tableView rowHeight UITableViewAutoma
  • 如何在 typeorm 中使用 LEFT JOIN LATERAL?

    我想在 TypeOrm 中使用以下查询 但找不到将其转换为 TypeOrm 的方法 任何帮助表示赞赏 SELECT FROM blocked times bt LEFT JOIN LATERAL SELECT FROM bookings b
  • 带有泛型类声明的命名空间约束

    我想知道是否 如果可以的话如何 可以将命名空间定义为泛型类声明中的约束参数 我所拥有的是这样的 namespaceMyProject Models Entities namespaceMyProject Tests BaseTest 现在我
  • pg_stat_activity 中具有“空闲”状态的持久“COMMIT”查询

    如果我查询 select from pg stat activity where application name example application 我得到了很多行 哪个州是idle查询是COMMIT 它们是持久的并且不会消失 一段时

随机推荐

  • 我什么时候应该使用geom_map?

    我正在制作一个等值线图 并在 ggplot 中添加了点 因此 按照最后一个例子geom map帮助文档 http docs ggplot2 org 0 9 2 1 geom map html 我想出了这个 require ggplot2 r
  • Ruby ||= Objective-C 中的等效项

    我最近一直在学习 ruby 并且基本上喜欢 功能 因为它会让在 Objective C 中编写惰性 getter 变得更加容易 目前我编写吸气剂 例如 NSArray myArray if myArray myArray NSArray a
  • 如何在一段时间后隐藏推送通知?

    我必须在一分钟后隐藏推送通知 为了实现这一目标 我应该在 Service Worker 中做什么 您可以使用notification close 方法 https developer mozilla org en US docs Web A
  • Spring JPA - “java.lang.IllegalArgumentException:投影类型必须是接口!” (使用本机查询)

    我正在尝试从 Oracle 数据库检索时间戳日期 但代码抛出 java lang IllegalArgumentException 投影类型必须是 界面 我尝试使用本机查询 因为原始查询对于使用 Spring JPA 方法或 JPQL 来说
  • 使用 ASP.NET MVC 的 SEO URL

    有没有一个确定的DO and DONT当实施 seo url 时 许多好的做法对于 html 网站来说似乎很好 但在中型 大型数据库网站上却失效了 据我所知 网址应该是www mysite com category page name he
  • require_once 与子文件夹[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我的文件夹
  • Angular2/Angular 种子 http-proxy-middleware 代理 api 请求

    我正在使用角种子项目 https github com mgechev angular seed tree master tools并尝试为在不同端口上运行的后端服务的 api 请求设置代理 到目前为止我的代码 Add proxy midd
  • 如何在 PowerShell 中取消“终止批处理作业 (Y/N)”确认?

    When I press Ctrl C in PowerShell I receive 终止批处理作业 是 否 如同https superuser com questions 35698 how to supress terminate b
  • 在 JFrame 中绘制矩形不起作用

    我有一段代码应该在JFrame但是当我在 Eclipse 上运行该程序时 它只是打开框架 但没有在其上绘制圆圈 这是代码 import javax swing import java awt public class Infout Info
  • 错误:2 UNKNOWN:访问被拒绝:通道 [contentbackchainchannel] 创建者组织

    我已经与两个组织建立了结构网络 协调者组织和参与者组织 使用orchestratororg的用户 我可以调用或查询链代码 但是当尝试使用participantorg的用户查询时 我收到如下错误 错误 2 未知 访问被拒绝 通道 conten
  • constexpr 默认默认构造函数

    如果我想声明我的 Clang 3 8 和 GCC 5 3 我会收到编译器错误default ed 默认构造函数为constexpr 根据this https stackoverflow com questions 20810378 shou
  • google action包如何定义自定义槽类型?

    您好 这是一个关于 google home action sdk gactions exe 的问题 at https developers google com actions reference rest Shared Types Que
  • Angular Material - 设置调色板

    我正在尝试结合材料设计建立一个 Angular 项目 我的 package json 的一部分如下所示 dependencies angular2 material button 2 0 0 alpha 3 angular2 materia
  • 如何在两台电脑之间共享svn仓库

    我的工作站上有 SVN 存储库 我在工作站和笔记本电脑上都使用它 在工作站上 我可以在本地访问存储库 但在笔记本电脑上 我必须连接互联网才能访问存储库 这不方便 因为我无法在飞机 火车和其他无互联网的地方工作 我想比较修订等 在笔记本电脑上
  • 如何获取mysql中两个日期之间的月份列表

    我必须获取 mysql 中两个日期之间的月份列表 For Example My Input is From date 23 01 2013 To Date 01 04 2014 Output Should be Jan 2013 Feb 2
  • 验证错误:ul 不允许作为元素 span 的子元素

    我不明白为什么 WC3 验证器将此 HTML 标记为无效 它报告的错误是 在此上下文中 不允许元素 ul 作为元素 span 的子元素 抑制该子树中的更多错误 我正在使用 HTML5 此代码用于面包屑 span class bread ul
  • 如何以编程方式显示“清除默认值”?

    现在我正在开发一个家庭启动器应用程序 我想清除默认家庭启动器的默认设置 例如 三星主页 即 我想展示Settings gt Applications gt Manage Application gt Samsung Home gt clea
  • Swift:未定义的符号:iTunesApplication

    我现在正在尝试创建 Swift OS X 应用程序 但发现使用 ScriptingBridge 很困难 我包含了正确的 iTunes h 文件 并且当我将 iTunesApplication 写入类型时 Xcode 没有给出任何错误 但是
  • eclipse:链接资源的位置无效

    我尝试链接一个项目文件夹 该文件夹是特殊的 vista 文件夹 appdata roaming user myproj 它显示了上面的错误消息 什么阻止这样做 我尝试以管理员身份运行 但它给出了相同的消息 当然 从appdata文件夹中出来
  • 具有多个约束的 PostgreSQL 更新插入

    我正在尝试在有两个约束的表上进行更新插入 一种是a列是唯一的 另一种是b c d和e列一起是唯一的 我不想要的是 a b c d 和 e 一起是唯一的 因为这将允许两行在 a 列中具有相同的值 如果违反第二个约束 唯一的 b c d e 则