当外键引用父表时,为什么父表没有匹配的主键或唯一键?

时间:2013-12-02 16:58:35

标签: sql db2 iseries-navigator

所以我遇到这个问题,我的表的外键没有正确引用上一个表。我正在使用DB2 for IBM i进行编码(使用使用COLLECTIONS的旧语言而不是SCHEMA ----它是我学院课程的一部分)

确切的错误消息是:

  

SQL State:42890   供应商代码:-573   消息:[SQL0573] UMALIK5中的表EMPLOYEE没有匹配的父键。原因。 。 。 。 。 :在FOREIGN KEY子句中为UMALIK5中的约束CAMPUS_FK指定了引用列列表。 UMALIK5中的父表EMPLOYEE没有匹配的PRIMARY或UNIQUE键。如果文件已分区,则必须对父文件的访问路径进行非分区。无法添加约束。恢复。 。 。 :执行以下操作之一并再次尝试请求: - 在FOREIGN KEY子句中指定一个表,该表具有与引用列列表匹配的PRIMARY或UNIQUE键。 - 更改引用列列表以匹配父表上定义的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));

我不知道自己需要做什么,当我运行DB2脚本时,Employee表创建的表很好,但由于某种原因,CAMPUS表没有。

我做错了什么?

谢谢你的帮助。

1 个答案:

答案 0 :(得分:4)

从字面上理解错误消息。为了拥有外键,您必须在父表中引用一些将返回一个记录的内容。您正在尝试引用manager_num,它不仅不唯一,而且实际上可能为null。这就是db2对你咆哮的原因。