Что ж, проблема 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