Создание ограничений внешнего ключа для нескольких таблиц - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть таблица с именем ProjectList. У меня есть две другие таблицы с именами Estimates и Orders.

Первичные ключи для Estimates и Orders и : внешние ключи в ProjectList. Сначала создается запись ProjectList, затем создаются записи Estimate, а затем и запись Order.

Как создать ограничения внешнего ключа в ProjectList для Estimates и Orders без нарушения ограничений внешнего ключа Order ?

Единственное, о чем я могу думать, - это создать пустую запись Orders при создании Оценки. Не уверен, что это элегантное решение.

1 Ответ

0 голосов
/ 10 апреля 2020

Что ж, проблема root здесь - это логическая ошибка : ваша модель БД утверждает, что можно получить оценку проекта и заказ до того, как проект существует.
Чтобы проиллюстрировать эту точку , логическая модель должна выглядеть примерно так:

-- Project PRO exists.
--
project {PRO}
     PK {PRO}
-- Project estimate number EST_NO of project PRO exists.
--
estimate {PRO, EST_NO}
      PK {PRO, EST_NO}

      FK {PRO} REFERENCES project {PRO}
-- Project order number ORD_NO of project PRO exists.
--
order {PRO, ORD_NO}
   PK {PRO, ORD_NO}

   FK {PRO} REFERENCES project {PRO}

Обратите внимание, как вы не можете создать смету или заказ перед проектом. Если по какой-то причине вы предпочитаете идентификаторы из одного столбца , то пример можно изменить следующим образом:

-- Project PRO_ID exists.
--
project {PRO_ID}
     PK {PRO_ID}

-- Project estimate identified by EST_ID
-- for project PRO_ID exists.
--
estimate {EST_ID, PRO_ID}
      PK {EST_ID}

      FK {PRO_ID} REFERENCES project {PRO_ID}

-- Project order identified by ORD_ID
-- for project PRO_ID exists.
--
order {ORD_ID, PRO_ID}
   PK {ORD_ID

   FK {PRO_ID} REFERENCES project {PRO_ID}

Таким образом, FKs в вашем примере перевернуты. Дизайн базы данных - все о логике c, это вытекает из этого. Несмотря на то, что вы можете найти способ справиться с обнаруженной технической проблемой 1016 *, используя хитрость SQL, основная логическая ошибка (ошибка) останется.

Примечание:

All attributes (columns) NOT NULL

PK = Primary Key
AK = Alternate Key (Unique)
FK = Foreign Key
...