ORA-2270错误是一个简单的逻辑错误:当我们在外键中列出的列与父表上的主键或唯一约束不匹配时,就会发生这种错误.造成这种情况的常见原因是
- 父级完全缺少主键或唯一约束
- FOREIGN KEY子句引用了父表中的错误列
- 父表的约束是复合键,我们还没有引用FOREIGN KEY语句中的所有列.
在你发布的代码中,两者似乎都不是这样.但这是在转移视线,因为你发布的代码是does not run.从前面的编辑判断,我认为你不是在发布你的实际代码,而是在发布一些简化的示例.不幸的是,在简化的过程中,你已经消除了导致ORA-2270错误的任何因素.
SQL> CREATE TABLE JOB
(
ID NUMBER NOT NULL ,
USERID NUMBER,
CONSTRAINT B_PK PRIMARY KEY ( ID ) ENABLE
); 2 3 4 5 6
Table created.
SQL> CREATE TABLE USER
(
ID NUMBER NOT NULL ,
CONSTRAINT U_PK PRIMARY KEY ( ID ) ENABLE
); 2 3 4 5
CREATE TABLE USER
*
ERROR at line 1:
ORA-00903: invalid table name
SQL>
该语句失败,因为USER是保留关键字,因此我们无法指定表USER.我们来解决这个问题:
SQL> 1
1* CREATE TABLE USER
SQL> a s
1* CREATE TABLE USERs
SQL> l
1 CREATE TABLE USERs
2 (
3 ID NUMBER NOT NULL ,
4 CONSTRAINT U_PK PRIMARY KEY ( ID ) ENABLE
5* )
SQL> r
1 CREATE TABLE USERs
2 (
3 ID NUMBER NOT NULL ,
4 CONSTRAINT U_PK PRIMARY KEY ( ID ) ENABLE
5* )
Table created.
SQL> Alter Table JOB ADD CONSTRAINT FK_USERID FOREIGN KEY(USERID) REFERENCES USERS(ID);
Table altered.
SQL>
瞧!没有ORA-2270错误.
唉,我们在这里无法进一步帮助你.你的代码中有一个bug.你可以在这里发布你的代码,我们中的一个可以发现你的错误.或者你可以判断自己的代码,自己发现它.
注意:代码的早期版本将HOB.USERID定义为VARCHAR2(20).因为USER.ID被定义为一个数字,所以try 创建外键会抛出一个不同的错误:
ORA-02267:列类型与引用的列类型不兼容
避免不匹配的简单方法是使用外键语法缺省列的数据类型:
CREATE TABLE USERs
(
ID number NOT NULL ,
CONSTRAINT U_PK PRIMARY KEY ( ID ) ENABLE
);
CREATE TABLE JOB
(
ID NUMBER NOT NULL ,
USERID constraint FK_USERID references users,
CONSTRAINT B_PK PRIMARY KEY ( ID ) ENABLE
);