Объединить составные внешние ключи в MySQL? - PullRequest
0 голосов
/ 26 января 2019

Рассмотрим 3 таблицы в MySQL , а именно T1 , T2 , A

T1 -> t1_id as pk, a_id
T2 -> t2_id as pk, a_id
A -> a_id

Теперь мне нужно создать таблицу сопоставления для ( T1 до T2 ), чтобы

  1. Я мог отображать только t1_id и t2_id с одинаковыми a_id
  2. Отображение должно быть много ко многим
  3. Отображение t1_id и t2_id должны оставаться уникальными.

Таблица сопоставления выглядит следующим образом.

M_T1_T2 -> map_id as pk, a_id, t1_id, t2_id

Вопрос: Какие ограничения внешнего ключа предполагается добавить?

1 Ответ

0 голосов
/ 26 января 2019

Установите уникальное ограничение на t1_id, a_id в t1 и t2_id, a_id в t2.Эти пары в любом случае уникальны, потому что t1_id или t2_id являются первичными ключами и поэтому уникальны.Но такое ограничение необходимо, чтобы позволить внешнему ключу ссылаться на такую ​​пару.

Тогда в вашей таблице ссылок давайте назовем его t1_t2, имеем t1_id, t2_id и a_id и два внешнихклавиши t1_id, a_id ссылаются t1_id, a_id в t1 и t2_id, a_id ссылаются t2_id, a_id в t2.То есть a_id должно быть одинаковым в обеих ссылочных записях.

Чтобы тройка t1_id, t2_id, a_id была уникальной, наложите на них уникальное ограничение или просто объявите их как первичный ключ.

CREATE TABLE a
             (a_id integer,
              PRIMARY KEY (a_id));

CREATE TABLE t1
             (t1_id integer,
              a_id integer,
              PRIMARY KEY (t1_id),
              FOREIGN KEY (a_id)
                          REFERENCES a
                                     (a_id),
              UNIQUE (t1_id,
                      a_id));

CREATE TABLE t2
             (t2_id integer,
              a_id integer,
              PRIMARY KEY (t2_id),
              FOREIGN KEY (a_id)
                          REFERENCES a
                                     (a_id),
              UNIQUE (t2_id,
                      a_id));

CREATE TABLE t1_t2
             (t1_id integer,
              t2_id integer,
              a_id integer,
              PRIMARY KEY (t1_id,
                           t2_id,
                           a_id),
              FOREIGN KEY (t1_id,
                           a_id)
                          REFERENCES t1
                                     (t1_id,
                                      a_id),
              FOREIGN KEY (t2_id,
                           a_id)
                          REFERENCES t2
                                     (t2_id,
                                      a_id));
...