繁体   English   中英

结合唯一约束的软删除解决方案?

[英]Solution for softdeletes in combination with unique constraints?

我有一个 Orders 表,其中包含external_idshop_iddeleted_at列。 为了确保external_idshop_id的组合是唯一的,我对这 3 列有唯一的约束。

这是因为我们不计算唯一性的软删除值,因此如果在 Laravel 中被删除的deleted_at等于NULL ,它不会被软删除,但在任何其他情况下它是,这使得多个软删除记录成为可能。 例子:

external_id        |shop_id   |deleted_at         |
-------------------|----------|-------------------|
1                  |         5|             [NULL]| <-- should be unique
1                  |         5|2019-12-19 13:45:22|
1                  |         5|2019-12-19 13:35:45|

这听起来很棒,除了 1 个警告:MySQL 不会强制 NULL 值的唯一性,这对于它的工作很重要。 通常,解决方法是将可为空的默认值更改为空字符串。 然而,deleted_at 是一个时间戳。

create table orders (external_id int, shop_id int, deleted_at timestamp);
 ALTER TABLE orders ADD COLUMN `n_deleted_at` timestamp AS (COALESCE(deleted_at, '1980-01-01')) VIRTUAL;
 CREATE UNIQUE INDEX idx ON orders (external_id, shop_id, n_deleted_at);
 INSERT INTO orders (external_id, shop_id, deleted_at) VALUES (1, 5, NULL); INSERT INTO orders (external_id, shop_id, deleted_at) VALUES (1, 5, '2019-12-19 13:45:2'); INSERT INTO orders (external_id, shop_id, deleted_at) VALUES (1, 5, '2019-12-19 13:35:45');
 INSERT INTO orders (external_id, shop_id, deleted_at) VALUES (1, 5, '2019-12-19 13:35:45');
\n关键“orders.idx”的重复条目“1-5-2019-12-19 13:35:45”\n
INSERT INTO orders (external_id, shop_id, deleted_at) VALUES (1, 5, NULL);
\n键“orders.idx”的重复条目“1-5-1980-01-01 00:00:00”\n

db<> 在这里摆弄

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM