_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-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>
そして、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
);
Jobテーブルのデータ型(Varchar2(20))は、USERテーブルのデータ型(NUMBER NOT NULL)と一致しません。
私の場合、問題は無効なPKが原因でした。
有効にするには:
制約名を探します:
SELECT * FROM USER_CONS_COLUMNS WHERE TABLE_NAME = 'referenced_table_name';
次に、次のコマンドを使用して有効にするために制約名を取得しました。
ALTER TABLE table_name ENABLE CONSTRAINT constraint_name;
スキームは正しい。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);
存在しないユーザーを持つすべてのジョブを削除します。これらを、アーカイブデータを含むこのテーブルのコピーに移行することをお勧めします。
おそらく、主キーが欠落している場合は、親テーブルから定義されていません。その後、発生します。
次のように親に定義する主キーを追加します:
ALTER TABLE "FE_PRODUCT" ADD CONSTRAINT "FE_PRODUCT_PK" PRIMARY KEY ("ID") ENABLE;
これがうまくいくことを願っています。
私のシナリオでは、次のような同じ問題に直面しました。
最初に教科書の表を作成しました
_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制約は存在しますが、無効になっています
このコマンドを実行するとき:
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
参照されるテーブルには、タイプが一致する主キー制約があります。私の場合、このエラーの根本的な原因は、主キー制約が無効になっていることです。
主キーが親テーブルでまだ定義されていない場合、この問題が発生する可能性があります。既存のテーブルで主キーを定義してください。例えば:
ALTER TABLE table_name
ADD PRIMARY KEY (the_column_which_is_primary_key);
USERIDの宣言の違いは問題ではありません
JOB: UserID is Varchar
USER: UserID is Number?