我有一个表,其中我使用布尔列deleted
来表示特定记录是否已被用户“删除”(意思是,它出现在垃圾箱列表而不是普通列表中)。这些物品都有slug,应该是独一无二的。
但是,如果用户想要添加与已删除记录的 slug 相同的 slug 的项目,则应该允许。我尝试了一个独特的指数这样做的deleted
和slug
,但是,这给了,如果这项目将被删除的问题:那么就应该在与同塞,这将使违反约束垃圾桶列表两个项目。
所以实际上我需要一个仅适用于deleted
=0的记录的约束
我已经看到了问题自定义唯一列约束,仅当一列具有特定值时才强制执行,但是,它仅适用于 PostgreSQL,而我使用的是 MySQL。MySQL有没有办法做到这一点,或者一个很好的解决方法?
我想制作deleted
一个整数而不是布尔值,其中 0 表示未删除,而任何其他数字表示已删除。然后,具有相同 slug 的已删除项目在deleted
列中可能具有不同的值。
但是,这意味着接口软件(用 PHP 编写)必须检查deleted
如果发生约束违规,它可以在列中放置什么,当然我更喜欢纯 MySQL 解决方案。如果我无论如何要在 PHP 代码中编写它,我宁愿更改该slug
值,例如,id
在删除项目时将记录的前置到 slug - 或者,为已删除的项目创建第二个表记录,其中不存在此类约束。
无论如何,有没有一种纯 MySQL 的方式来做到这一点?
注意:当然,当用户请求恢复先前删除的项目而其 slug 已分配给新记录时,这样的方案会遇到困难。无论如何,这都必须在接口代码中完成。
如果你有办法生成唯一的整数,你就不必检查在“deleted”中可以使用什么值,并且MySQL确实......该函数每次被调用时UUID_SHORT()
都会生成一个唯一且单调的值。BIGINT UNSIGNED
该函数适用于每秒 16.7M 新值,并且只要保持不变并且@@SERVER_ID
您不关闭服务器、向后设置系统时钟,就永远不会返回重复的(或小于先前的)值及时,并重新启动服务器......即使你这样做,重复值的几率仍然很小,但不再真正不可能。
您还可以在 MySQL 5.6 上将“deleted”设为DATETIME(6)
or TIMESTAMP(6)
,使用“0000-00-00 00:00:00.000000”表示“未删除”并NOW()
表示已删除。
尽管我尽了最大的努力,我还是无法让 MySQL 产生精确NOW()
到微秒的冲突。
归档时间: |
|
查看次数: |
4622 次 |
最近记录: |