26

私は2つのテーブルを持っています、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 keyUSERIDUSERIDJOBS

ORA-02270およびSO関連の質問を調査しました

4

11 に答える 11

45

ORA-2270エラーは単純な論理エラーです。外部キーにリストされている列が主キーまたは親テーブルの一意性制約と一致しない場合に発生します。これの一般的な理由は次のとおりです

  • 親にはPRIMARYKEYまたは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> 

そして、見よ!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
 );
于 2012-05-30T03:33:43.043 に答える
8

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

于 2012-05-29T15:34:31.603 に答える
6

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

それを有効にするには:

  1. 私は次の制約名を探します:

    SELECT * FROM USER_CONS_COLUMNS WHERE TABLE_NAME = 'referenced_table_name';

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

    ALTER TABLE table_name ENABLE CONSTRAINT constraint_name;

于 2017-05-04T11:43:40.593 に答える
2

スキームは正しく、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);

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

于 2012-05-29T18:20:58.420 に答える
2

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

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

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(単一列の主キーを持つ)の間に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制約は存在しますが、無効になっています

于 2014-10-23T15:23:21.173 に答える
2

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

以下のように、親で定義された主キーを追加します。

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

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

于 2015-03-12T12:17:08.107 に答える
2

新しいテーブルを作成するための次のスクリプトがあります。

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;

その後、最初のスクリプトを使用して問題なく新しいテーブルを作成しました

于 2020-02-18T15:05:58.180 に答える
1

このコマンドを実行する場合:

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

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

于 2019-04-11T17:37:51.460 に答える
0

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

JOB: UserID is Varchar
USER: UserID is Number?
于 2012-05-29T15:36:50.990 に答える
0

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

ALTER TABLE table_name
ADD PRIMARY KEY (the_column_which_is_primary_key);
于 2018-09-27T04:35:47.780 に答える
-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));
于 2015-04-22T10:02:09.633 に答える