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

时间:2012-05-29 15:30:17

标签: database oracle foreign-keys primary-key

我有两个表,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 {}} {}} {}} {}} {1}}与他有关,有关如何解决此问题的任何想法或建议?

已研究ORA-02270SO related question

11 个答案:

答案 0 :(得分:32)

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> 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错误。

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

答案 1 :(得分:8)

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

答案 2 :(得分:2)

方案是正确的,User.ID必须是User的主键,Job.ID应该是Job和Job的主键.UserID应该是User.ID的外键。此外,您的命令似乎在语法上是正确的。

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

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

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

答案 3 :(得分:2)

最重要的是,当您有一个缺失的主键时,未在父表中定义。然后就会发生。

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

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

希望这会奏效。

答案 4 :(得分:2)

在我的情况下,问题是由于禁用PK造成的。

为了启用它:

  1. 我用:

    查找Constraint名称

    SELECT * FROM USER_CONS_COLUMNS WHERE TABLE_NAME = 'referenced_table_name';

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

    ALTER TABLE table_name ENABLE CONSTRAINT constraint_name;

答案 5 :(得分:1)

我在我的方案中面临同样的问题,如下所示:

我先用

创建了教科书表
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));

现在,当我想在章节(具有复合主键)和主题(具有单列主键)之间创建一个名为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的帖子,他在帖子中提到了一个声明:

  

这是造成这种情况的常见原因    - 父母完全没有约束    - 父表的约束是复合键,我们没有引用外键语句中的所有列。
   - 引用的PK约束存在但是禁用

答案 6 :(得分:0)

您的USERID声明之间的区别不是

JOB: UserID is Varchar
USER: UserID is Number?

答案 7 :(得分:0)

如果尚未在父表上定义主键,则可能会出现此问题。请尝试在现有表上定义主键。 例如:

ALTER TABLE table_name
ADD PRIMARY KEY (the_column_which_is_primary_key);

答案 8 :(得分:0)

运行此命令时:

ALTER TABLE MYTABLENAME MODIFY CONSTRAINT MYCONSTRAINTNAME_FK ENABLE;

我收到此错误:

ORA-02270: no matching unique or primary key for this column-list
02270. 00000 -  "no matching unique or primary key for this column-list"
*Cause:    A REFERENCES clause in a CREATE/ALTER TABLE statement
          gives a column-list for which there is no matching unique or primary
          key constraint in the referenced table.
*Action:   Find the correct column names using the ALL_CONS_COLUMNS

所引用的表具有匹配类型的主键约束。在我的情况下,此错误的根本原因是主键约束被禁用。

答案 9 :(得分:0)

我们具有以下用于创建新表的脚本:

CREATE TABLE new_table
(
id                     NUMBER(32) PRIMARY KEY,
referenced_table_id    NUMBER(32)    NOT NULL,
CONSTRAINT fk_new_table_referenced_table_id
    FOREIGN KEY (referenced_table_id)
        REFERENCES referenced_table (id)
);

我们在执行时遇到此错误:

[42000] [2270] ORA-02270:为此没有匹配的唯一键或主键 列列表

问题是由于在我们的案例中禁用了引用表的主键。我们通过

启用了它
ALTER TABLE referenced_table ENABLE PRIMARY KEY USING INDEX;

此后,我们使用第一个脚本创建了新表,没有任何问题

答案 10 :(得分:-3)

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