1. ホーム
  2. database

[解決済み] Oracle (ORA-02270) : この列に一致するユニークキーまたはプライマリキーがありません-リストエラー

2022-02-18 17:45:37

質問

2つのテーブルがあります。 Table JOBTable 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 として持つことはできませんが、1つの USERID を複数持つことができます。 JOBS この問題を解決する方法について、何かご意見やご提案があればお聞かせください。

調査済み ORA-02270 SOに関する質問

解決方法を教えてください。

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> 

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

残念ですが、これ以上お手伝いできることはあまりありません。 あなたのコードにバグがあるのです。 あなたのコードをここに投稿すれば、私たちの誰かがあなたの間違いを発見してくれるでしょう。 あるいは、自分のコードをチェックして、自分で発見することもできます。


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