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