Уникальное ограничение с условиями в MYSQL - PullRequest
3 голосов
/ 12 июня 2009

В postgres у нас есть определенное ограничение, которое по существу позволяет нам ограничить число записей в таблице с определенным значением до одного. Мы создали это ограничение:

создать уникальный индексный список $ default $ uk для list_group (visitor_uid), где list_type = 'default';

Это означает, что ограничение уникальности применяется только в том случае, если list_type = 'default', поэтому для каждого посетителя в таблице может быть только один список 'default'

Похоже, что MySql не поддерживает дополнительное ограничение where. Есть ли другой способ поддержать это в схеме базы данных для MySQL?

Ответы [ 5 ]

2 голосов
/ 12 июня 2009

MYSQL не поддерживает такие типы ограничений.

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

Почему бы вам не определить значение по умолчанию как таковое, чтобы оно имело 1 в качестве первичного ключа? Таким образом, нормального уникального ограничения на ПК уже будет достаточно.

Если вам ничего не подходит, вы также можете подумать об изменении своей модели данных.

0 голосов
/ 21 октября 2015

Мои два цента:

почему бы вам не создать столбец только для хранения уникального значения (возможно, вы можете назвать его как-то как is_list_type_default), а другой для хранения всех значений. Если вы сделаете это, вы можете наложить ограничение unique на первый столбец.

0 голосов
/ 14 июня 2009

Я никогда не использую MySQL, но, возможно, вы можете создать такой индекс:

CREATE UNIQUE INDEX list$default$uk ON list_group ((CASE WHEN list_type='default' THEN NULL ELSE visitor_uid END));

Пояснение: Уникальный индекс не должен заботиться о значениях NULL. Поэтому убедитесь, что индексное выражение возвращает NULL для каждой строки, где list_type <> 'default'.

0 голосов
/ 13 июня 2009

Я предположил, что вам нужно написать триггер, чтобы проверить его.

0 голосов
/ 12 июня 2009

На самом деле это существует. Большинство ограничений зависит от таблицы Engine. Я думаю, что InnoDB поддерживает это.

Для этого необходимо добавить уникальный индекс с уникальной комбинацией:

ALTER TABLE visitor ADD UNIQUE unique_default_visitor( visitor_uid, list_type );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...