我有两个表,Table JOB
和Table 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}}与他有关,有关如何解决此问题的任何想法或建议?
答案 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造成的。
为了启用它:
我用:
查找Constraint名称 SELECT * FROM USER_CONS_COLUMNS WHERE TABLE_NAME = 'referenced_table_name';
然后我使用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));