Нам нужно будет выявить и решить следующее:
- какие возможные проблемы у нас уже могут быть
- как обрабатывать вставку
- какобработать обновление
Возможная проблема
У вас может быть несколько записей с одинаковыми mac_address
и null
delete_date
.Вам нужно будет убедиться, что у вас есть по одной записи для каждого mac_address
, который имеет null
delete_date
.Если вы хотите использовать constraint
для unique
, вы можете установить не удаленные записи 'delete_date
на какую-то дату в очень отдаленном будущем и будете знать, что записи, имеющие delete_date
в будущем, не будут удалены,Если эта будущая дата будет постоянной, то это решит вашу проблему, но это решение не очень элегантно.Вместо этого я все равно использовал бы дату null
, но тогда вам потребуются другие меры.
Триггеры перед вставкой или обновлением
Ответ P.Salmon описывает такой подход, я не буду его дублировать,но вместо этого проголосуйте за его ответ.Проблема с триггерами заключается в том, что в случае, когда есть еще записи, которые нужно вставить / обновить, и триггер выдает ошибку на раннем этапе, тогда некоторые допустимые вставки или модификации не произойдут.
Проблемы с вставкой и обновлением
Проблема с insert
заключается в том, что новая запись будет соответствовать mac_address
с null
delete_date
.Проблема с обновлением состоит в том, что обновленная запись будет приводить к дублированию mac_address
с другой записью, которая имеет null
delete_date
.Вы можете сделать вставку select или update
с условием, например:
where not ((not (iot_devices.deleted_date is null)) and (iot_devices.mac_address = 'youvalue'))
Обработка старых записей по мере продвижения
Вы можете обновить delete_date более старых записей кактриггер на insert
или update
'' вместо нуля
Вы можете изменить тип вашего delete_date на varchar
и иметь ''
для не удаленных значений,Тогда вы можете использовать ограничение.Однако в этом случае поиск по delete_date
станет более сложным.