web-dev-qa-db-ja.com

Oracle(ORA-02270):この列リストエラーに一致する一意キーまたは主キーはありません

_Table JOB_と_Table USER_の2つのテーブルがあります。ここに構造があります

_ 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_制約が必要であるように見えますが、1つのUSERIDに複数のJOBS彼に関連する、この問題を解決する方法についての考えや提案はありますか?

調査済み ORA-0227 および SO関連の質問

17
Rachel

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> 

そして、lo! ORA-2270エラーはありません。

残念ながら、さらに支援するためにここでできることはあまりありません。コードにバグがあります。ここにコードを投稿すると、私たちの1人が間違いを見つけることができます。または、独自のコードを確認して、自分で発見することもできます。


注:コードの以前のバージョンでは、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
 );
32
APC

Jobテーブルのデータ型(Varchar2(20))は、USERテーブルのデータ型(NUMBER NOT NULL)と一致しません。

8
LSU.Net

私の場合、問題は無効なPKが原因でした。

有効にするには:

  1. 制約名を探します:

    SELECT * FROM USER_CONS_COLUMNS WHERE TABLE_NAME = 'referenced_table_name';

  2. 次に、次のコマンドを使用して有効にするために制約名を取得しました。

    ALTER TABLE table_name ENABLE CONSTRAINT constraint_name;

2
Lorenzo Lerate

スキームは正しい。User.IDはUserの主キー、Job.IDはJobの主キー、Job.UserIDはUser.IDの外部キーである必要があります。また、コマンドは構文的に正しいように見えます。

それで何が間違っているのでしょうか? User.IDにペアを持たないJob.UserIDが少なくともあると思います。たとえば、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);

存在しないユーザーを持つすべてのジョブを削除します。これらを、アーカイブデータを含むこのテーブルのコピーに移行することをお勧めします。

2
Lajos Arpad

おそらく、主キーが欠落している場合は、親テーブルから定義されていません。その後、発生します。

次のように親に定義する主キーを追加します:

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

これがうまくいくことを願っています。

2
Navin

私のシナリオでは、次のような同じ問題に直面しました。

最初に教科書の表を作成しました

_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制約は存在しますが、無効になっています

1
chetan pawar

このコマンドを実行するとき:

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

参照されるテーブルには、タイプが一致する主キー制約があります。私の場合、このエラーの根本的な原因は、主キー制約が無効になっていることです。

0
Amy B

主キーが親テーブルでまだ定義されていない場合、この問題が発生する可能性があります。既存のテーブルで主キーを定義してください。例えば:

ALTER TABLE table_name
ADD PRIMARY KEY (the_column_which_is_primary_key);
0
Shivendra Gupta

USERIDの宣言の違いは問題ではありません

JOB: UserID is Varchar
USER: UserID is Number?
0
codingbiz