我有一张这样定义的桌子
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_id
3的行为true。
然而,将第2行的
approved
更新为true将失败,因为第1行也有foo_id
1,并且已经被批准。
试试这个
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
您不需要排除约束,过滤后的唯一索引可以:
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,在数据库上创建了和扩展。 如何不可交换 有没有办法做我想做的事,还是我在做傻事