Добавить несколько ограничений в одном столбце - PullRequest
1 голос
/ 05 марта 2020

Моя таблица содержит следующую таблицу:

  1. команды
  2. лиги
  3. игроки
  4. тренеры
  5. ключевые слова

Теперь в таблице ключевых слов есть несколько столбцов: id, topic_id, topic_type.

Для команд, лиг, игроков и тренеров у них есть несколько ключевых слов (отношение «один ко многим» с ключевыми словами). Например: если в командном столе есть команда AB C с идентификатором 4; в таблице ключевых слов будет id, 4, team. Если в таблице игроков есть CDE плеера с идентификатором 3; в таблице ключевых слов будет ID, 3, игрок и так далее.

Итак, здесь я пытаюсь добавить ограничение в ключевые слова, которое позволит мне удалить ключевое слово, когда topi c удаляется из любого topic_type. Как это сделать? Мы можем легко сделать это через Schema ondelete Cascade, прочитав некоторые ответы, но в моем случае должно быть ограничение на 1 элемент, но из нескольких источников.

Как я могу установить ограничение на таблицу ключевых слов для всех команд, лиг, игроков и тренеров?

Спасибо

1 Ответ

0 голосов
/ 05 марта 2020

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

Альтернативным вариантом будет изменение структуры вашей базы данных. Вы могли бы разделить таблицы для хранения отношений между каждой сущностью (командами, лигой, игроками, тренерами) и ключевыми словами.

Таким образом, вы могли бы создать четыре дополнительные таблицы бриджа:

teams_keywords  (team_id,    keyword_id)
league_keywords (league_id,  keyword_id)
players_keywords(player_id,  keyword_id)
coaches_keywords(coaches_id, keyword_id)

У каждой таблицы есть внешний ключ, который относится к таблице сущностей, а другой - к таблице keyword. Вы можете использовать опцию on delete cascade в этих внешних ключах, чтобы добавить нужный логический номер c.

Обратите внимание, что такая структура также может упростить некоторые ваши запросы. Скажем, вы хотите получить все teams, которые соответствуют заданному ключевому слову, тогда:

select t.*
from teams t
inner join team_keywords tk on tk.team_id = t.team_id
inner join keywords k on k.keyword_id = tk.keyword_id
where k.name = 'foo'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...