ORA-2270は自体は単純なエラーで、外部キー(FOREIGN KEY)の作成時、参照先列に主キー制約、または一意制約がない場合に発生します。
エラー自体は単純なのですが、ユニークインデックス作ることで対応出来るという勘違いを2回ほど繰り返し、検索ですぐに理由が出てこなかったのでこちらで公開させていただくことにしました。
エラーメッセージ
ORA-02270: この列リストに対して一致する一意キーまたは主キーが存在しません。
ORA-02270: no matching unique or primary key for this column-list
ORA-02270: no matching unique or primary key for this column-list
https://docs.oracle.com/cd/F19136_01/errmg/ORA-02140.html
データベース・エラー・メッセージ
19c
F18117-03(原本部品番号:E95938-04)
4 ORA-01500からORA-02098
発生原因
create table や alter table による外部キー(FOREIGN KEY)の作成時、参照先列に主キー制約、または一意制約がない場合に発生します。
対処方法
参照先となる表の列に主キー制約か一意制約を付与します。(筆者が勘違いした部分で、create unique indexでは一意制約とみなされません。)
恐らく引っかかるほとんどの方は一意制約だと思いますので、一意制約の追加例を載せておきます。REFERENCE_TABLEを参照するTEST_TABLEを作成します。
SQL> create table "REFERENCE_TABLE" (
2 "ID" number
3 , "FK02_COL" varchar2(1)
4 , constraint "REFERENCE_TABLE_PK" primary key ("ID") enable
5 );
表が作成されました。
SQL> create table "TEST_TABLE" (
2 "REFERENCE_TABLE_ID" number
3 , "FK02_COL" varchar2(1)
4 );
表が作成されました。
SQL> -- PKはFKにて参照可能です。
SQL> alter table "TEST_TABLE"
2 add constraint "TEST_TABLE_FK01"
3 foreign key ("REFERENCE_TABLE_ID")
4 references "REFERENCE_TABLE" ("ID");
表が変更されました。
SQL> -- 一意制約がないとエラーとなります。
SQL> alter table "TEST_TABLE"
2 add constraint "TEST_TABLE_FK02"
3 foreign key ("FK02_COL")
4 references "REFERENCE_TABLE" ("FK02_COL");
references "REFERENCE_TABLE" ("FK02_COL")
*
行4でエラーが発生しました。:
ORA-02270: この列リストに対して一致する一意キーまたは主キーが存在しません。
SQL> -- 参照元のテーブルに一意制約を付与します。
SQL> alter table "REFERENCE_TABLE"
2 add constraint "REFERENCE_TABLE_IDX01" unique ("FK02_COL") using index enable;
表が変更されました。
SQL> alter table "TEST_TABLE"
2 add constraint "TEST_TABLE_FK02"
3 foreign key ("FK02_COL")
4 references "REFERENCE_TABLE" ("FK02_COL");
表が変更されました。
