sql >> データベース >  >> RDS >> Oracle

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

    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
     );
    


    1. LISTAGG関数:文字列連結の結果が長すぎます

    2. MariaDBでのCOT()のしくみ

    3. PostgreSQL作成スキーマ

    4. MySQLとnull値の比較