Oracle(ORA-02270):此列列表错误没有匹配的唯一键或主键

Rac*_*hel 17 database oracle foreign-keys primary-key

我有两个表,Table JOB并且Table USER,这里是结构

 CREATE TABLE JOB
 (
   ID       NUMBER NOT NULL ,
   USERID   NUMBER,
   CONSTRAINT B_PK PRIMARY KEY ( ID ) ENABLE
 );

 CREATE TABLE USER
 (
   ID       NUMBER NOT NULL ,
   CONSTRAINT U_PK PRIMARY KEY ( ID ) ENABLE
 );
Run Code Online (Sandbox Code Playgroud)

现在,我想添加外键约束来JOB引用USER表,如

Alter Table JOB ADD CONSTRAINT FK_USERID FOREIGN KEY(USERID) REFERENCES USER(ID);
Run Code Online (Sandbox Code Playgroud)

这个抛出Oracle (ORA-02270) : no matching unique or primary key for this column-list error,做一些调查似乎我们需要unique key or primary key约束,USERID但我不能拥有,因为一个人USERID可以有多个JOBS与他相关,任何关于如何解决这个问题的想法或建议?

研究了ORA-02270SO相关的问题

APC*_*APC 34

ORA-2270错误非常简单:当我们在外键中引用的列与父表上的主键或唯一约束不匹配时,会发生错误.常见的原因是

  • 父母完全没有约束
  • 父表的约束是复合键,我们没有引用外键语句中的所有列.

在您发布的代码中似乎都不是这种情况.但这是一个红色的鲱鱼,因为你的代码没有像你发布的那样运行.从以前的编辑来看,我认为你不是发布你的实际代码,而是一些简化的例子.不幸的是,在简化过程中,您已经根除了导致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> 
Run Code Online (Sandbox Code Playgroud)

因此,该语句失败,因为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> 
Run Code Online (Sandbox Code Playgroud)

瞧!没有ORA-2270错误.

所以,我们在这里做的不多,可以帮助你.您的代码中存在错误.你可以在这里发布你的代码,我们中的一个人可以发现你的错误.或者您可以检查自己的代码并自己发现它.

  • "......显然你没有理解它.错误非常简单:"我们(我们所有人)都很好地找到比这更好,更高质量的沟通方式. (17认同)

LSU*_*Net 8

作业表(Varchar2(20))中的数据类型与USER表中的数据类型(NUMBER NOT NULL)不匹配.


Lor*_*ate 6

在我的情况下,问题是由禁用的 PK 引起的。

为了启用它:

  1. 我寻找约束名称:

    SELECT * FROM USER_CONS_COLUMNS WHERE TABLE_NAME = 'referenced_table_name';

  2. 然后我取了约束名称,以便使用以下命令启用它:

    ALTER TABLE table_name ENABLE CONSTRAINT constraint_name;