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

Database Oracle(ORA-02270):此列列表没有匹配的唯一或主键错误,database,oracle,foreign-keys,primary-key,Database,Oracle,Foreign Keys,Primary Key,我有两个表,表作业和表用户,下面是结构 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 ); 现在,我想向J

我有两个表,
表作业
表用户
,下面是结构

 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):此列列表没有匹配的唯一键或主键错误,做一些调查,似乎我们需要对
用户ID
设置
唯一键或主键
约束,但我不能这样做,因为一个
用户ID
可以有多个
作业
与他相关,对如何解决此问题有何想法或建议


研究并

作业表中的数据类型(Varchar2(20))与用户表中的数据类型不匹配(数字不为空)。

用户ID声明之间的差异不是问题所在吗

JOB: UserID is Varchar
USER: UserID is Number?

方案正确,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(不在UserID的可能值1,2,3,4,6,7,8中),则将无法创建外键约束。解决方案:

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

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

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是保留关键字,因此无法命名表用户。让我们解决这个问题:

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

唉,我们在这里帮不了你多少忙。您的代码中有一个bug。你可以在这里发布你的代码,我们中的一个可以发现你的错误。或者您可以检查自己的代码并自己发现它


注意:代码的早期版本将HOB.USERID定义为VARCHAR2(20)。由于USER.ID定义为一个数字,因此尝试创建外键会引发不同的错误:

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

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

我首先用

create table textbook(txtbk_isbn varchar2(13)
primary key,txtbk_title varchar2(40),
txtbk_author varchar2(40) );
然后是章节表:

创建表格章节(txtbk_isbn varchar2(13),章节标题varchar2(40),
约束pk_章主键(txtbk_isbn,章标题),
约束章节txtbook外键(txtbk_isbn)参考教科书(txtbk_isbn))

然后是主题表:

create table topic(topic_id varchar2(20) primary key,topic_name varchar2(40));
现在,当我想在chapter(具有复合主键)和topic(具有单列主键)之间创建一个名为chapter_topic的关系时,我遇到了以下问题:

创建表格章节主题(txtbk isbn varchar2(13),章节标题varchar2(40),主题id varchar2(20),
主键(txtbk isbn,章节标题,主题id),
外键(txtbk_isbn)参考教科书(txtbk_isbn),
外键(章节标题)参考章节(章节标题),
外键(主题id)引用主题(主题id))

解决方案是引用复合外键,如下所示:

创建表格章节主题(txtbk isbn varchar2(13),章节标题varchar2(40),主题id varchar2(20),
主键(txtbk isbn,章节标题,主题id),
外键(txtbk_isbn,章节标题)参考章节(txtbk_isbn,章节标题),
外键(主题id)引用主题(主题id))

多亏了APC帖子,他在帖子中提到了一项声明:

常见的原因是
-父级完全缺少约束
-父表的约束是复合键,我们没有引用外键语句中的所有列。
-引用的PK约束存在,但已禁用


最可能的情况是,缺少的主键未从父表中定义。然后它发生了

与添加主键类似,在父级中定义如下:

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

希望这能起作用。

在我的案例中,问题是由禁用的PK引起的

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));
为了启用它:

  • 我使用以下命令查找约束名称:

    从用户列中选择*,其中表名='referenced_TABLE_NAME'

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

    ALTER TABLE\u name启用约束\u name


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


    运行此命令时:

    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
    

    引用的表具有匹配类型的主键约束。在我的例子中,此错误的根本原因是禁用了主键约束。

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

    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)
    );
    
    而且我们得到了
    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)
    );
    
    ALTER TABLE referenced_table ENABLE PRIMARY KEY USING INDEX;