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错误是一个简单的逻辑错误:当我们在外键中列出的列与父表上的主键或唯一约束不匹配时,就会发生此错误。常见的原因有
- 父项完全缺少主键或唯一约束
- 外键子句引用了父表中的错误列
- 父表的约束是一个复合键,我们没有引用外键语句中的所有列
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;