Разрешить только одну строку с «основным» флагом в таблице - PullRequest
0 голосов
/ 14 марта 2019

У меня есть следующая таблица:

mysql> описать группы;

+--------------------+---------------+------+-----+---------+----------------+
| Field              | Type          | Null | Key | Default | Extra          |
+--------------------+---------------+------+-----+---------+----------------+
| id                 | int(11)       | NO   | PRI | NULL    | auto_increment |
| jobId              | int(11)       | NO   | MUL | NULL    |                |
| name               | varchar(45)   | YES  |     | NULL    |                |
| notes              | varchar(1024) | YES  |     |         |                |
| main               | tinyint(1)    | NO   |     | 0       |                |
+--------------------+---------------+------+-----+---------+----------------+

Есть еще одна таблица, НЕ релевантная здесь, с заданиями.Это «дочерняя» таблица, 1: n для рабочих мест.Мне нужна только ОДНА из этих групп.

Итак, задания будут иметь несколько записей «групп»;Я хочу, чтобы только ОДИН из них для конкретной работы мог быть установлен как «1».

Это применяется в коде, но не в БД прямо сейчас.

ЕстьВозможно ли обеспечить это на уровне БД?

1 Ответ

1 голос
/ 15 марта 2019

Вы можете создать уникальный индекс для пары столбцов:

UNIQUE KEY uix_1 (jobid, main)

Уникальный индекс допускает множественные пустые значения NULL-столбцов, поэтому пара (1, NULL) может быть вставлена ​​несколько раз, а пара (1, 1) может быть вставлена ​​только один раз.

Если вы хотите ограничить значения для столбца main 1 и NULL, у вас есть несколько вариантов:

  • Использовать CHECK ограничение - требуется MySQL 8
  • Использовать ENUM('yes') - использование чисел в качестве значений перечисления получило
  • Создать FOREIGN KEY (main) REFERENCES main_values(main)
  • Использовать BIT(1) тип данных - это также разрешит 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...