Почему родительская таблица не имеет соответствующего первичного или уникального ключа, когда внешний ключ ссылается на родительскую таблицу?

Итак, у меня возникла проблема, когда внешний ключ моей таблицы неправильно ссылается на предыдущую таблицу. Я кодирую в DB2 для IBM i (используя старый язык, в котором вместо SCHEMA используются COLLECTIONS — это часть учебной программы в моем колледже)

точное сообщение об ошибке:

Состояние SQL: 42890 Код поставщика: -573 Сообщение: [SQL0573] Таблица EMPLOYEE в UMALIK5 не имеет соответствующего родительского ключа. Причина . . . . . : Список ссылающихся столбцов был указан в предложении FOREIGN KEY для ограничения CAMPUS_FK в UMALIK5. Родительская таблица EMPLOYEE в UMALIK5 не имеет соответствующего ключа PRIMARY или UNIQUE. Если файл разбит на разделы, путь доступа к родительскому файлу не должен быть разделен на разделы. Ограничение не может быть добавлено. Восстановление . . . : выполните одно из следующих действий и повторите запрос: -- Укажите таблицу в предложении FOREIGN KEY, которая имеет ключ PRIMARY или UNIQUE, соответствующий списку столбцов, на которые ссылаются. -- Измените список ссылающихся столбцов, чтобы он соответствовал определению ПЕРВИЧНОГО или УНИКАЛЬНОГО ключа, заданного в родительской таблице. -- Если родительский файл разбит на разделы, добавьте путь доступа без разделов. Обработка завершена, так как выделенный оператор не завершился успешно

Ошибка, которую я нашел на странице поддержки IBM, оказалась еще более запутанной, чем эта.

Вот мой код:

CREATE TABLE UMALIK5.POSITION (
POSNCODE VARCHAR (10) CONSTRAINT UMALIK5.POSITION_PK PRIMARY KEY,
POSNDESC VARCHAR (50));

SELECT * FROM UMALIK5.SYSTABLES;
SELECT * FROM UMALIK5.SYSCOLUMNS
 WHERE TABLE_NAME = 'EMPLOYEE';
CREATE TABLE UMALIK5.EMPLOYEE (
EMP_NUM VARCHAR (10) CONSTRAINT UMALIK5.EMPLOYEE_PK PRIMARY KEY,
EMP_F_NAME VARCHAR (50),
EMP_L_NAME VARCHAR (50),
MANAGER_NUM VARCHAR (10),
SUPERVISOR_CODE VARCHAR (10),
PAYRATE VARCHAR (20),
POSNCODE VARCHAR (10),
HIREDATE VARCHAR (50),
CONSTRAINT UMALIK5.EMPLOYEE_FK FOREIGN KEY (POSNCODE)
REFERENCES UMALIK5.POSITION(POSNCODE));

CREATE TABLE UMALIK5.CAMPUS (
CAMPUS_ID VARCHAR (10) CONSTRAINT UMALIK5.CAMPUS_PK PRIMARY KEY,
CAMPUS_NAME VARCHAR (30),
MANAGER_NUM VARCHAR (10),
CONSTRAINT UMALIK5.CAMPUS_FK FOREIGN KEY (MANAGER_NUM)
REFERENCES UMALIK5.EMPLOYEE(MANAGER_NUM));

Я в недоумении, что мне нужно делать, таблица Employee прекрасно создается, когда я запускаю свой сценарий DB2, но по какой-то причине таблица CAMPUS этого не делает.

Что я делаю неправильно?

Спасибо за помощь.


person SorryEh    schedule 02.12.2013    source источник
comment
Не уверен, что это причина вашей ошибки, но нормализованная база данных будет ссылаться на первичный ключ родительской таблицы при настройке внешних ключей. Вы этого не делаете.   -  person Dan Bracuk    schedule 02.12.2013
comment
В моем новом кумулятивном дизайне у меня есть этот Campus [CampusID, CampusName, Mnger#] FK Mnger# --> Сотрудник, однако в моей таблице сотрудников у меня есть posncode fk для таблицы позиций .... так что я попытался сделать здесь в код db2... Должен ли я создать составной ключ в таблице сотрудников с emp_num и manager_num? или я должен каким-то образом сделать составной внешний ключ в таблице кампуса?   -  person SorryEh    schedule 02.12.2013


Ответы (1)


Воспринимайте сообщение об ошибке буквально. Чтобы иметь внешний ключ, вы должны сослаться на что-то в родительской таблице, которая вернет ровно одну запись. Вы пытаетесь сослаться на manager_num, который не только не уникален, но и может быть нулевым. Вот почему db2 лает на вас.

person Dan Bracuk    schedule 02.12.2013
comment
хорошо, так что это работает, когда я делаю Manager_Num первичным ключом, однако EMP_NUM предполагается первичным ключом таблицы сотрудников, потому что этот сценарий создается на основе решения задания 1 профессора, которые представляют собой таблицы, которые мы должны использовать с установить первичный и внешний ключи. Так что я в полной растерянности, я даже пытался поставить NOT NULL в manager_num в таблице сотрудников. - person SorryEh; 02.12.2013
comment
Ваш внешний ключ должен ссылаться на EMP_NUM, а не на MANAGER_NUM. Я предполагаю, что MANAGER_NUM сам по себе является внешним ключом, ссылающимся на тот же самый EMP_NUM. Кстати, почему ваши якобы числовые поля и поля даты определены как VARCHAR(10)? - person mustaccio; 02.12.2013
comment
Я только что получил это как раз перед тем, как увидел твое сообщение, лол! Я не заметил, что manager_num ссылается на один и тот же emp_num, потому что мой профессор написал это по-другому. и я использую varchar, потому что этот сценарий в основном предназначен для нескольких детских садов, где, например, идентификатор кампуса/emp_num может быть комбинацией букв и цифр. Итак, я решил, что varchar будет лучше? Что касается поля даты, то в задании не было описано, будет ли дата записана как 12.02.2013 или как 2 декабря 2013 года.... поэтому я подумал, что varchar также подойдет для этого. - person SorryEh; 02.12.2013
comment
Я бы, вероятно, добавил конкретный столбец идентификатора, который является числовым, и использовал бы его внутри. Буквенно-цифровые идентификаторы могут быть просто атрибутами, такими как first_name и last_name, и использоваться при представлении данных конечному пользователю. То же самое относится и к полям даты. Здесь вы должны хранить свою дату в собственном формате данных и преобразовывать ее в желаемый формат всякий раз, когда вы представляете данные конечному пользователю. - person Peter Schuetze; 03.12.2013
comment
@PeterSchuetze Сейчас я внес исправления, спасибо. Вопрос, однако, как мне создать два первичных ключа в таблице, где оба первичных ключа являются внешними ключами для двух отдельных таблиц, и где один из внешних ключей ранее не был создан? Пример: Registered_Authorized_Adults [FamID, AuthorizedAdult#] FK FamID --› Registration_Form FK AuthorizedAdult# --› Adults, FamID уже существует, но AuthorizedAdult# отсутствует в Adults, а Adult# существует, однако это две разные вещи, где Authorized один как экстренный контакт. Я не знаю, как поместить это в скрипт db2. - person SorryEh; 03.12.2013
comment
@Umeed: похоже на новый вопрос, опубликуйте его как новый вопрос. Кстати, в таблице может быть только один первичный ключ. У вас может быть столько внешних ключей, сколько вы хотите на столе. - person Peter Schuetze; 03.12.2013
comment
ладно спасибо за наводку! если я все еще застрял, я опубликую новый вопрос! - person SorryEh; 03.12.2013