[英]Solution for softdeletes in combination with unique constraints?
我有一个 Orders 表,其中包含external_id
、 shop_id
和deleted_at
列。 为了确保external_id
和shop_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.