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

我有两个表, Table JOBTable 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 ); 

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

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

这抛出了Oracle (ORA-02270) : no matching unique or primary key for this column-list error ,做一些调查,似乎我们需要有unique key or primary key约束USERID但我不能有一个USERID有多个JOBS与他联系,有什么想法或build议如何解决这个问题?

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

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> 

因此,该语句失败,因为USER是保留关键字,我们不能命名表USER。 我们来解决这个问题:

 SQL> 1 1* CREATE TABLE USER SQL> as 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错误。

所以,我们没有太多的工作可以帮助你。 你的代码中有一个错误。 你可以在这里发布你的代码,我们其中一个可以发现你的错误。 或者你可以检查自己的代码,并为自己发现。

Job表(Varchar2(20))中的数据types与USER表(NUMBER NOT NULL)中的数据types不匹配。

该scheme是正确的,User.ID必须是User,Job的主键.ID应该是Job和Job的主键。UserID应该是User.ID的外键。 而且,你的命令似乎在语法上是正确的。

那么有什么可能是错的? 我相信你至less有一个在User.ID中没有一个对的Job.UserID。 例如,如果User.ID的所有值都是:1,2,3,4,6,7,8,并且您的Job.UserID值为5(不在1,2,3,4,6之间,7,8,这是UserID的可能值),您将无法创build外键约束。 解:

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

将删除不存在用户的所有作业。 您可能希望将这些文件迁移到包含归档数据的此表副本中。

最有可能当你有一个缺失主键不是从父表定义。 那么就发生了。

像在父级中添加主键定义如下:

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

希望这会工作。

在我的情况下,我遇到了同样的问题:

我用第一个创build教科书表

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

然后章节表:

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

然后话题表:

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

现在当我想创build章节(具有复合主键)和主题(具有单列主键)之间的称为chapter_topic的关系时,我遇到了以下查询的问题:

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

解决的办法是引用复合外键如下:

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

感谢APC在他的post中提到的一个声明:

这是常见的原因
– 父母完全没有约束
– 父表的约束是一个复合键,我们没有引用外键语句中的所有列。

USERID的声明不是你的问题的区别

 JOB: UserID is Varchar USER: UserID is Number? 

在我的情况下,问题是由于残疾人士的原因。

为了启用它:

  1. 我用以下方式查找约束名称:

    SELECT * FROM USER_CONS_COLUMNS WHERE TABLE_NAME = 'referenced_table_name';

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

    ALTER TABLE table_name ENABLE CONSTRAINT constraint_name;

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