Решение для softdeletes в сочетании с уникальными ограничениями? - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть таблица заказов, с колонками external_id, shop_id и deleted_at. Чтобы убедиться, что комбинация external_id и shop_id уникальна, у меня есть уникальное ограничение на эти 3 столбца.

Это потому, что мы не учитываем мягко удаленные значения для уникальности, следовательно, если deleted_at равно NULL в Laravel, это не программно удалено, но в любом другом случае это так, что делает возможным несколько программно-удаленных записей. Пример:

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|

Звучит великолепно, за исключением одного предупреждения: MySQL не обеспечивает уникальность значений NULL, что важно для этого. Обычно Обходной путь заключается в изменении значения по умолчанию, допускающего обнуляемость, на пустую строку. Тем не менее, удаленный_ат является временной меткой.

1 Ответ

1 голос
/ 05 февраля 2020
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');
Duplicate entry '1-5-2019-12-19 13:35:45' for key 'orders.idx'
INSERT INTO orders (external_id, shop_id, deleted_at) VALUES (1, 5, NULL);
Duplicate entry '1-5-1980-01-01 00:00:00' for key 'orders.idx'

db <> скрипка здесь

...