相关疑难解决方法(0)

PostgreSQL 多列唯一约束和 NULL 值

我有一张如下表:

create table my_table (
    id   int8 not null,
    id_A int8 not null,
    id_B int8 not null,
    id_C int8 null,
    constraint pk_my_table primary key (id),
    constraint u_constrainte unique (id_A, id_B, id_C)
);
Run Code Online (Sandbox Code Playgroud)

我想(id_A, id_B, id_C)在任何情况下都与众不同。所以下面的两个插入肯定会导致错误:

INSERT INTO my_table VALUES (1, 1, 2, NULL);
INSERT INTO my_table VALUES (2, 1, 2, NULL);
Run Code Online (Sandbox Code Playgroud)

但它没有按预期运行,因为根据文档,两个NULL值不会相互比较,因此两个插入都没有错误地通过。

我怎么能保证我的唯一约束,即使id_C可以NULL在这种情况下?实际上,真正的问题是:我可以在“纯 sql”中保证这种唯一性,还是必须在更高级别(在我的情况下为 java)来实现它?

postgresql null constraint unique-constraint

137
推荐指数
3
解决办法
13万
查看次数

仅当列具有特定值时 MySQL 唯一索引

我有一个表,其中我使用布尔列deleted来表示特定记录是否已被用户“删除”(意思是,它出现在垃圾箱列表而不是普通列表中)。这些物品都有slug,应该是独一无二的。

但是,如果用户想要添加与已删除记录的 slug 相同的 slug 的项目,则应该允许。我尝试了一个独特的指数这样做的deletedslug,但是,这给了,如果这项目将被删除的问题:那么就应该在与同塞,这将使违反约束垃圾桶列表两个项目。

所以实际上我需要一个仅适用于deleted=0的记录的约束

我已经看到了问题自定义唯一列约束,仅当一列具有特定值时才强制执行,但是,它仅适用于 PostgreSQL,而我使用的是 MySQL。MySQL有没有办法做到这一点,或者一个很好的解决方法?

我想制作deleted一个整数而不是布尔值,其中 0 表示未删除,而任何其他数字表示删除。然后,具有相同 slug 的已删除项目在deleted列中可能具有不同的值。

但是,这意味着接口软件(用 PHP 编写)必须检查deleted如果发生约束违规,它可以在列中放置什么,当然我更喜欢纯 MySQL 解决方案。如果我无论如何要在 PHP 代码中编写它,我宁愿更改该slug值,例如,id在删除项目时将记录的前置到 slug - 或者,为已删除的项目创建第二个表记录,其中不存在此类约束。

无论如何,有没有一种纯 MySQL 的方式来做到这一点?


注意:当然,当用户请求恢复先前删除的项目而其 slug 已分配给新记录时,这样的方案会遇到困难。无论如何,这都必须在接口代码中完成。

mysql index constraint

5
推荐指数
1
解决办法
4622
查看次数

对特定配对的唯一约束

我试图找出一个特殊的UNIQUE约束:表中有很多列Users,但只有这两列与问题相关:

id bigint,
active boolean,
...
Run Code Online (Sandbox Code Playgroud)

我想允许多行具有相同的id-其中只有一行可能具有active = true.

例如,可以有很多行包含id = 1active = false,但只有一行可以包含id = 1active = true

postgresql database-design unique-constraint

0
推荐指数
1
解决办法
999
查看次数