唯一约束,取决于字段的值

Unique Constraint depending on value of a field

提问人:IleNea 提问时间:11/16/2023 最后编辑:yiviIleNea 更新时间:11/16/2023 访问量:47

问:

我需要为我的订阅表创建一个唯一约束,以禁止用户同时拥有两个活动订阅。我创建了迁移并更新了我的实体类:

CREATE UNIQUE INDEX unique_user_id_status ON user_subscription_plan (user_id, status)

但是我刚刚意识到状态字段可以有多个值(活动、非活动、已处理),因此我可能只有在两个状态处于活动状态时才应该有此约束,但例如,我可以有两个已处理的状态。这是正确的吗?那么我如何在实体类上做到这一点呢?任何建议都受到高度赞赏。

mysql symfony 唯一约束

评论

0赞 Jakumi 11/16/2023
将历史记录/日志记录与“实时”数据放在同一个表中很少能很好地处理唯一约束。使用事务时,可以确保只有一个user_id具有特定状态。但是,当涉及金钱时,为什么要禁止多个有效的订阅计划?^^顺便说一句:唯一约束失败可能会扼杀实体管理器的连接并使您的生活更加艰难,因此您可能希望重构,而不是对可能不合适的数据库模式进行功能失调的唯一约束......
0赞 Littlefoot 11/16/2023
您使用哪个数据库?
0赞 IleNea 11/16/2023
@Littlefoot Mysql
0赞 Nico Haase 11/16/2023
即使对数据库有这样的约束不是一个坏主意,在应用程序中检查它(在PHP代码中)可能会更容易
0赞 Dylan KAS 11/16/2023
你可以用symfony约束来做到这一点,但是我们需要你的实体来指导你
1赞 Dylan KAS 11/20/2023
只需在谷歌上输入“symfony约束”,并尝试寻找适合您正在做的事情的约束。如果没有,则创建自己的约束(只需添加 2 个类即可)

答:

1赞 Littlefoot 11/16/2023 #1

使用 MySQL 时,查看基于函数的索引是否有帮助。

create table test (user_id int, status varchar(20));

create unique index ui1_test on test
  (user_id, (case when status = 'active' then status end));

它不会让您插入状态为 的两行,但不会阻止您插入任意数量的行,并具有任何其他状态(您提到 和 )。activeinactiveprocessed

看看小提琴的演示。