Oracle (ORA-02270) : no matching unique or primary key for this column-list error

匿名 (未验证) 提交于 2019-12-03 02:14:01

问题:

I have two tables, Table JOB and Table USER, here is the structure

 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  );

Now, i want to add foreign key constraint to JOB referencing to USER table, as

Alter Table JOB ADD CONSTRAINT FK_USERID FOREIGN KEY(USERID) REFERENCES USER(ID);

this throws Oracle (ORA-02270) : no matching unique or primary key for this column-list error, doing some investigation it appears that we need to have either unique key or primary key constraint on USERID but I cannot have that as one USERID can have multiple JOBS associated with him, any thoughts or suggestions on how to fix this issue?

Researched ORA-02270 and SO related question

回答1:

The ORA-2270 error is quite simple: it happens when the columns we reference in the foreign key do not match a primary key or unique constraint on the parent table. Common reasons for this are

  • the parent lacks a constraint altogether
  • the parent table's constraint is a compound key and we haven't referenced all the columns in the foreign key statement.

Neither appears to be the case in your posted code. But that's a red herring, because your code does not run as you have posted it. Judging from the previous edits I presume you are not posting your actual code but some simplified example. Unfortunately in the process of simplification you have eradicated whatever is causing the ORA-2270 error.

Because, if we fix your code so it runs, it - er - runs. All the way.

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> 

So, that statement failed because USER is a reserved keyword, and we cannot name a table USER. Let's fix that:

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> 

And lo! No ORA-2270 error.

So, there's not much we can do here to help you further. You have a bug in your code. You can post your code here and one of us can spot your mistake. Or you can check your own code and discover it for yourself.



回答2:

The data type in the Job table (Varchar2(20)) does not match the data type in the USER table (NUMBER NOT NULL).



回答3:

The scheme is correct, User.ID must be the primary key of User, Job.ID should be the primary key of Job and Job.UserID should be a foreign key to User.ID. Also, your commands appear to be syntactically correct.

So what could be wrong? I believe you have at least a Job.UserID which doesn't have a pair in User.ID. For instance, if all values of User.ID are: 1,2,3,4,6,7,8 and you have a value of Job.UserID of 5 (which is not among 1,2,3,4,6,7,8, which are the possible values of UserID), you will not be able to create your foreign key constraint. Solution:

delete from Job where UserID in (select distinct User.ID from User);

will delete all jobs with nonexistent users. You might want to migrate these to a copy of this table which will contain archive data.



回答4:

Most Probably when you have a missing Primary key is not defined from parent table. then It occurs.

Like Add the primary key define in parent as below:

ALTER TABLE "FE_PRODUCT" ADD CONSTRAINT "FE_PRODUCT_PK" PRIMARY KEY ("ID") ENABLE;

Hope this will work.



回答5:

I faced the same issue in my scenario as follow:

I created textbook table first with

create table textbook(txtbk_isbn varchar2(13) primary key,txtbk_title varchar2(40), txtbk_author varchar2(40) );

Then chapter table:

create table chapter(txtbk_isbn varchar2(13),chapter_title varchar2(40), constraint pk_chapter primary key(txtbk_isbn,chapter_title), constraint chapter_txtbook foreign key (txtbk_isbn) references textbook (txtbk_isbn));

Then topic table:

create table topic(topic_id varchar2(20) primary key,topic_name varchar2(40));

Now when I wanted to create a relationship called chapter_topic between chapter (having composite primary key) and topic (having single column primary key), I faced issue with following query:

create table chapter_topic(txtbk_isbn varchar2(13),chapter_title varchar2(40),topic_id varchar2(20), primary key (txtbk_isbn, chapter_title, topic_id), foreign key (txtbk_isbn) references textbook(txtbk_isbn), foreign key (chapter_title) references chapter(chapter_title), foreign key (topic_id) references topic (topic_id));

The solution was to refer to composite foreign key as below:

create table chapter_topic(txtbk_isbn varchar2(13),chapter_title varchar2(40),topic_id varchar2(20), primary key (txtbk_isbn, chapter_title, topic_id), foreign key (txtbk_isbn, chapter_title) references chapter(txtbk_isbn, chapter_title), foreign key (topic_id) references topic (topic_id));

Thanks to APC post in which he mentioned in his post a statement that:

Common reasons for this are
- the parent lacks a constraint altogether
- the parent table's constraint is a compound key and we haven't referenced all the columns in the foreign key statement.



回答6:

Isn't the difference between your declaration of USERID the problem

JOB: UserID is Varchar USER: UserID is Number?


回答7:

In my case the problem was cause by a disabled PK.

In order to enable it:

  1. I look for the Constraint name with:

    SELECT * FROM USER_CONS_COLUMNS WHERE TABLE_NAME = 'referenced_table_name';

  2. Then I took the Constraint name in order to enable it with the following command:

    ALTER TABLE table_name ENABLE CONSTRAINT constraint_name;



回答8:

create table articles(code varchar2(30)constraint articles_pk primary key,titre varchar2(30), support varchar2(30) constraint support_fk references supports(support),type_support varchar2(30), numeroDePage varchar2(30),datepublication date,categorie varchar2(30)constraint categorie_fk references organismes(categorie), tendance varchar2(30)constraint tendance_fk references apreciations(tendance));


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!