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

插入/更新时的Postgres排除约束

法子昂
2023-03-14

我有一张这样定义的桌子

                               Table "public.foo"
  Column  |  Type   | Collation | Nullable |               Default               
----------+---------+-----------+----------+-------------------------------------
 foo_id   | integer |           | not null | nextval('foo_foo_id_seq'::regclass)
 bar_id   | integer |           |          | 
 approved | boolean |           |          | 
Indexes:
    "foo_pkey" PRIMARY KEY, btree (foo_id)
Foreign-key constraints:
    "foo_bar_id_fkey" FOREIGN KEY (bar_id) REFERENCES bar(bar_id)

我如何定义排除约束,以便只有一行具有特定条形码id的foo能够将批准的设置为true?

例如,使用以下数据:

 foo_id | bar_id | approved 
--------+--------+----------
      1 |      1 | t
      2 |      1 | 
      3 |      2 | 
(3 rows)

我将能够将批准行3设置为true,因为没有其他具有foo_id3的行为true。

然而,将第2行的approved更新为true将失败,因为第1行也有foo_id1,并且已经被批准。


共有2个答案

伏星汉
2023-03-14

试试这个

ALTER TABLE public.foo
ADD CONSTRAINT uniq_approved UNIQUE (bar_id, approved)

或者你可以创建唯一的索引

CREATE UNIQUE INDEX uniq_approved ON public.foo
USING btree (bar_id, approved)
WHERE approved
姬温文
2023-03-14

您不需要排除约束,过滤后的唯一索引可以:

create unique index only_one_approved_bar 
   on foo (bar_id)
   where approved;

我还建议将approved定义为notnull。允许null值的布尔列通常会引起持续的混淆。

 类似资料:
  • 我有两个表在postgres和。 用于创建表的Sql文件如下:https://nofile.io/f/Ef94rMFRh6C/file.sql 我想在每天结束时更新,条件如下: 如果已经不存在,那么从的记录需要插入到 如果存在,那么。 我使用下面的查询来更新歌曲摘要: 我得到以下错误: 错误:不存在与冲突规范匹配的唯一或排除约束

  • 插入、更新和删除语句基于以开头的层次结构生成 UpdateBase . 这个 Insert 和 Update 构建基于中介的 ValuesBase . DML基础构造函数 顶级的“插入”、“更新”、“删除”构造函数。 Object Name Description delete(table[, whereclause, bind, returning, ...], **dialect_kw) 构建

  • 问题内容: 我只是对某事感到好奇。让我说我有一个表,我将更新该值,然后将其删除,然后插入新的1。如果我以这种方式编写代码,这将非常容易: 但是,如果使用“ update”语句,它将更加容易。但我的问题是,有可能同时完成这3个步骤吗? 问题答案: 引用Oracle事务处理语句文档: 事务是一个逻辑的 原子工作单元 ,包含一个或多个SQL语句。事务对SQL语句进行分组,以使它们要么全部提交(这意味着它

  • 当您正在向上插入一行时(PostgreSQL) 还有更短的路吗?也就是说:使用所有排除值。 在SQLite中,我曾经做过:

  • 典型票务系统的PostgreSQL数据库问题。为什么我的upsert不更新现有票证? 门票表: 代码中开发的约束(不是db枚举类型的一部分): 只能是以下值之一:,或。 之前的门票: 运行此SQL以尝试向上插入第一个失败: 带有错误消息: 错误:不存在与冲突规范匹配的唯一或排除约束 我试着把它改成: 在之前移动子句以触发部分索引查询,但没有效果。 我只想更新“未完成”票证的、和(根据该表中定义的部

  • 我试图创建一个排除约束,防止有效时间戳范围重叠,但只比较具有相同文本值的记录的范围。我希望文本值比较不区分大小写。我可以将运算符与文本字段一起使用,但不能与字段一起使用,运算符是不可交换的。 这是PostgreSQL 9.5,在数据库上创建了和扩展。 如何不可交换 有没有办法做我想做的事,还是我在做傻事