UNIQUE Constraint, только если поле содержит определенное значение

Я пытаюсь создать ограничение UNIQUE INDEX для двух столбцов, но только тогда, когда другой столбец содержит значение 1. Например, column_1 и column_2 должны быть UNIQUE только тогда, когда active = 1. Любые строки, содержащие active = 0, могут совместно использовать значения для column_1 и column_2 с другой строкой, независимо от того, что такое другое значение строки для active. Но строки, в которых active = 1 не могут делиться значениями column_1 или column_2 с другой строкой с active = 1.

То, что я подразумеваю под "share", это две строки, имеющие одинаковые значения в одном столбце (столбцах). Пример: row1.a = row2.a И row1.b = row2.b. Значения будут разделяться только в том случае, если оба столбца в строке 1 соответствуют двум другим столбцам в строке 2.

Надеюсь, я поняла.:\

Ответ 1

Вы можете попробовать сделать многоколоночный индекс UNIQUE с помощью столбца_1, column_2 и активным, а затем установить active = NULL для строк, где уникальность не требуется. Кроме того, вы можете использовать триггеры (см. Синтаксис триггера MySQL) и проверьте каждую вставленную/обновленную строку, если такие значения уже находятся в таблице, но я думаю, что это будет довольно медленно.

Ответ 2

Я пытаюсь создать ограничение UNIQUE INDEX для двух столбцов, но только если в другом столбце указано значение 1

Вы можете установить значение "другого столбца" на уникальное значение, которое не равно 1. например, идентификатор записи.

Тогда единственное ограничение индекса может быть применено ко всем трем столбцам, включая "другой столбец". Позвольте вызвать столбец "другой столбец". Задайте значение columnX равным 1, если вы хотите применить уникальное ограничение к записи. Установите значение columnX в уникальное значение, если вы не хотите применять уникальное ограничение.

Тогда дополнительных действий/триггеров не требуется. Уникальный индекс для всех трех столбцов может решить вашу проблему.

Ответ 3

Индексы

являются агностиками внешних воздействий. Такое ограничение должно быть реализовано за пределами вашей базы данных.

Ответ 4

В SQL Server это может быть выполнено с помощью проверочных ограничений, однако я не знаю, поддерживает ли MySQL что-либо подобное.

Что будет работать в любой базе данных, так это то, что вы можете разделить таблицу на две части. Если записи, где active = 0, являются только историческими записями и никогда больше не станут активными, вы можете просто перенести их в другую таблицу и установить простое уникальное ограничение в исходной таблице.