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

Posted

技术标签:

【中文标题】Oracle (ORA-02270) : 此列列表错误没有匹配的唯一键或主键【英文标题】:Oracle (ORA-02270) : no matching unique or primary key for this column-list error 【发布时间】:2012-05-29 15:30:17 【问题描述】:

我有两张表,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,做一些调查似乎我们需要在USERID 上设置unique key or primary key 约束,但我不能这样,因为一个USERID 可以有多个JOBS 与他相关联,任何想法或有关如何解决此问题的建议?

研究了ORA-02270和SO related question

【问题讨论】:

建议:删除这些表,然后重新运行 DDL。我建议先创建 USER,然后再创建 JOB。让我们知道它是否有效。您也可以尝试将“USER”放在双引号中,如@LSU.Net 对第一个答案的评论中所述(如下)。 @APC:首先,我不打算浪费社区时间,我重视社区所付出的努力。除此之外,我不知道哪里产生了错误,所以有问题。 这个错误背后的原因是 - User 表的 ID 列不是唯一的或主键 【参考方案1】:

ORA-2270 错误是一个简单的逻辑错误:当我们在外键中列出的列与父表上的主键或唯一约束不匹配时,就会发生这种错误。造成这种情况的常见原因是

父级完全没有 PRIMARY KEY 或 UNIQUE 约束 外键子句引用了父表中的错误列 父表的约束是复合键,我们没有引用外键语句中的所有列。

在您发布的代码中似乎并非如此。但这是一条红鲱鱼,因为您的代码 没有像您发布的那样运行。从之前的编辑来看,我认为您发布的不是实际代码,而是一些简化的示例。不幸的是,在简化过程中,您已经消除了导致 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 错误。

唉,我们无法为您提供更多帮助。您的代码中有错误。您可以在此处发布您的代码,我们中的一个人可以发现您的错误。或者您可以检查自己的代码并自己发现它。


注意:早期版本的代码将 HOB.USERID 定义为 VARCHAR2(20)。因为 USER.ID 被定义为 NUMBER,所以尝试创建外键会引发不同的错误:

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

【讨论】:

"...显然你没有理解它。错误很简单:"我们(我们所有人)最好找到比这更好、更高质量的沟通方式。【参考方案2】:

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

【讨论】:

我应该提前提到它,id和userid都是数字类型。 您还有其他问题,Rachel,我创建了两个表以及 FK 约束,它工作正常。请注意,“USER”需要转义引号,并且您的主键也具有相同的约束名称,这是无效的 DDL。 此 DDL 在 Oracle 11g 中执行没有问题:codeCREATE 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); Alter Table JOB ADD CONSTRAINT FK_USERID FOREIGN KEY(USERID) REFERENCES "USER"(ID);【参考方案3】:

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

为了启用它:

    我查找约束名称:

    SELECT * FROM USER_CONS_COLUMNS WHERE TABLE_NAME = 'referenced_table_name';

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

    ALTER TABLE table_name ENABLE CONSTRAINT constraint_name;

【讨论】:

【参考方案4】:

方案正确,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);

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

【讨论】:

【参考方案5】:

很可能当您缺少未从父表定义的主键时。然后它发生了。

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

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

希望这会奏效。

【讨论】:

【参考方案6】:

我在我的场景中遇到了同样的问题,如下所示:

我首先创建了课本表

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 约束存在但已禁用

【讨论】:

【参考方案7】:

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

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;

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

【讨论】:

【参考方案8】:

运行此命令时:

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】:

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

JOB: UserID is Varchar
USER: UserID is Number?

【讨论】:

我已经纠正了有问题的错误,userid和id都是数字【参考方案10】:

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

ALTER TABLE table_name
ADD PRIMARY KEY (the_column_which_is_primary_key);

【讨论】:

【参考方案11】:
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));

【讨论】:

以上是关于Oracle (ORA-02270) : 此列列表错误没有匹配的唯一键或主键的主要内容,如果未能解决你的问题,请参考以下文章

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

如何修复 sql 中的“ORA-02270:此列列表没有匹配的唯一键或主键”错误

添加外键约束时遇到问题(错误 ORA-02270:此列列表没有匹配的唯一键或主键)

ORA-02270: 此列列表的唯一关键字或主键不匹配一些思路

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

更改表 - 错误 ORA-02270