Внешний ключ в оракуле - PullRequest
       11

Внешний ключ в оракуле

0 голосов
/ 15 апреля 2011

Я создал таблицу в Oracle, в которой есть один FK, который ссылается на 3 первичных ключа в 3 разных таблицах. Но когда я хочу вставить в него сообщение об ошибке, я вижу, что родительский ключ не найден! Что мне делать?

CREATE TABLE A
(   X       char(11)        not null,
    id      char(11)        not null,
    PRIMARY KEY(X,id),
    FOREIGN KEY(id) REFERENCES B(employee_id),
    FOREIGN KEY(id) REFERENCES C(customer_id)   
);

Ответы [ 3 ]

3 голосов
/ 15 апреля 2011

Если вы хотите, чтобы столбец ID в A был или внешним ключом для столбца EMPLOYEE_ID в B или внешним ключом для столбца CUSTOMER_ID в C у вас есть проблема - вы не можете объявить внешний ключ для этого или / или отношения типа.

С точки зрения моделирования данных у вас есть несколько вариантов

  • Вы можете создать два столбца в A, столбец EMPLOYEE_ID, который является обнуляемым внешним ключом для столбца EMPLOYEE_ID в B, и столбец CUSTOMER_ID, который является обнуляемым внешним ключом для столбца CUSTOMER_ID в C Затем вы можете создать проверочное ограничение на то, что ровно один из этих двух столбцов равен NULL.
  • Вы можете создать новую таблицу ENTITY, которая имеет все значения EMPLOYEE_ID и CUSTOMER_ID. EMPLOYEE_ID в B будет внешним ключом для столбца ENTITY_ID в ENTITY, как столбец CUSTOMER_ID в C и столбец ENTITY_ID в A.
  • Вы можете оставить столбцы в A и удалить внешний ключ. Тогда вы будете нести ответственность за проверку ссылочной целостности в вашем коде. Последний вариант, как правило, не очень хорошая идея.

Как правило, я бы тоже действительно подозревал столбцы, объявленные как CHAR (11). В Oracle практически нет случая, когда действительно имеет смысл использовать CHAR, а не VARCHAR2. В лучшем случае это стирка.

3 голосов
/ 15 апреля 2011

Ваш столбец id в таблице A относится к столбцу в таблице B, а также к столбцу в таблице C. Если вам нужно вставить данные в таблицу A, значение в поле id должно соответствовать значению в таблице.B и C, в противном случае вы нарушаете ограничение FK;невозможно вставить в таблицу A строку, содержащую столбец, ссылающийся на несуществующую строку в таблице B или C.

2 голосов
/ 15 апреля 2011

Создайте одну родительскую таблицу (для примера я назову ее Party).Ссылка на таблицу партий из всех трех таблиц A, B, C.В результате несколько внешних ключей будут заменены одним внешним ключом, ссылающимся на таблицу Party.Это пример шаблона «подтип» обобщения / специализации, который вы найдете во многих книгах по моделированию данных.

...