mysql - 如果第三列为真,则确保两列的唯一性
问题描述
| row (int) | thingy_a_id (int) | thingy_b_id (int) | bool | bunch_more_cols |
|----------- |------------------- |------------------- |------ |----------------- |
| 1 | 6 | 2 | 0 | |
| 2 | 3 | 3 | 0 | |
| 3 | 2 | 4 | 0 | |
| 4 | 2 | 4 | 0 | |
| 5 | 2 | 4 | 1 | |
| 6 | 6 | 2 | 0 | |
在我正在创建的数据库中,我需要两列的组合才能唯一,但只有当第三列为真时。因此,在上面的示例中,第 3 行和第 4 行具有相同的 a 和 b 列是可以的,因为 bool 为 False (0)。并且第 5 行具有与 3 和 4 相同的 a 和 b 列也是可以的,因为它是唯一一个 bool 为真的 (1)。而且,如果在 thingy_a_id 为 2、thingy_b_id 为 4 且 bool 为 False (0) 的情况下又提交了另一行,那就没问题了。
我需要防止的是另一行被提交,其中 thingy_a_id 为 2,thingy_b_id 为 4 并且 bool 为 True (1)。
这可以用mySql完成吗?我怎么能做到这一点?
解决方案
就目前而言,MySQL 不支持部分唯一索引(与 Postgres 等其他数据库不同)。
解决此问题的一种方法是用 s 替换0
inbool
列null
:如文档中所述,索引允许可以包含的列的多个值。UNIQUE
NULL
NULL
因此,您首先要确保该列被声明为null
able,然后将所有0
s 转换为null
:
update mytable set bool = null where bool = 0;
然后您可以创建唯一索引:
create unique index mytable_idx on mytable(thingy_a_id, thingy_b_id, bool);
有了这个设置,您可以放心,不会在(thingy_a_id, thingy_b_id)
什么时候bool
发生重复,并且在什么时候是1
允许的。bool
null
推荐阅读
- python - Gitlab-CI 使用令牌而不是 ssh 密钥从 setup.py 克隆私有仓库?
- ios - Swift UIDocument 保存不可靠
- java - 在 Wildfly/JBoss 应用服务器上以编程方式创建 Web 服务
- vba - VLookup 的问题和可能的解决方法
- python - 如果我们从用户那里获得输入,如果我们要求输入密码,如何获得输入为 *(星号)?
- python - 如何在pyqt5中获取不带引号的文件路径
- google-apps-script - 我需要一个脚本,它会在单元格值更改时自动触发 sendEmail 函数
- kubernetes - 获取停留在终止状态超过 10 分钟的 Pod 列表,并在 Ansible 中将其删除
- android - Android:如何从库回调到主应用程序项目?
- linux - Bash one-liner 保存到文件然后使用内容