Это довольно сложный процесс, который не может быть обработан с помощью простого ограничения.
Мы делаем это через триггер. Однако прежде чем написать триггер, вы должны быть в состоянии ответить на несколько вопросов:
мы хотим отменить вставку, если существует значение по умолчанию, изменить его на 0 вместо 1 или изменить существующее значение по умолчанию на 0 и оставить это значение равным 1?
что мы хотим сделать, если запись по умолчанию удалена, а другие записи не по умолчанию все еще там? Делаем ли мы один по умолчанию, если да, то как мы можем определить, какой из них?
Вам также нужно быть очень, очень осторожным, чтобы триггер обрабатывал обработку нескольких строк. Например, клиент может решить, что все записи определенного типа должны быть по умолчанию. Вы не будете изменять миллион записей по одной за раз, поэтому этот триггер должен быть в состоянии справиться с этим. Он также должен обрабатывать это без зацикливания или использования курсора (вы действительно не хотите, чтобы описанный выше тип транзакции занимал часы, блокирующие таблицу все время).
Вам также понадобится очень обширный сценарий тестирования для этого триггера, прежде чем он будет запущен. Вам нужно проверить:
добавление записи без значения по умолчанию, и это первая запись для этого клиента
добавление записи со значением по умолчанию, и это первая запись для этого клиента
добавление записи без значения по умолчанию, и это не первая запись для этого клиента
добавление записи со значением по умолчанию, и это не первая запись для этого клиента
Обновление записи, чтобы иметь значение по умолчанию, когда ни одна другая запись не имеет его (при условии, что вам не требуется, чтобы одна запись всегда была установлена по умолчанию)
Обновление записи для удаления по умолчанию
Удаление записи с глухим
Удаление записи без значения по умолчанию
Выполнение массовой вставки с несколькими ситуациями в данных, включая две записи, для каждой из которых isdefault установлено значение 1, и все ситуации, протестированные при выполнении отдельных вставок записей
Выполнение массового обновления с несколькими ситуациями в данных, включая две записи, для каждой из которых isdefault установлено значение 1, и все ситуации, протестированные при запуске отдельных обновлений записей
Выполнение массового удаления с несколькими ситуациями в данных, включая две записи, для каждой из которых isdefault установлено значение 1, и все ситуации, протестированные при запуске отдельной записи, удаляют