う~ん、知識不足が原因の大半なわけですが。
Firebird、システムテーブルの構造がイマイチピンとこない。
背景
外部参照キーがあると、外部から適当にデータを流し込むときに邪魔になることがあります。
「外部参照キーを考慮して流し込めよ」と言われれば、そりゃそうなのですが、まあ邪魔なんです。
ISQL.exeを利用して、外部参照キーを取得する
データベースにConncet して、
SHOW TABLE ほげほげTable;
でとれます。
SQLでは?
えらく難しい。
丸一日ほどなやんでいましたが、最終的にこちらを参考にしました。
まとめてとるならこんな感じになるらしい。
select
PK.RDB$RELATION_NAME as PKTABLE_NAME
,ISP.RDB$FIELD_NAME as PKCOLUMN_NAME
,FK.RDB$RELATION_NAME as FKTABLE_NAME
,ISF.RDB$FIELD_NAME as FKCOLUMN_NAME
,(ISP.RDB$FIELD_POSITION + 1) as KEY_SEQ
,PK.RDB$CONSTRAINT_NAME as PK_NAME
,FK.RDB$CONSTRAINT_NAME as FK_NAME
from
RDB$RELATION_CONSTRAINTS PK
,RDB$RELATION_CONSTRAINTS FK
,RDB$REF_CONSTRAINTS RC
,RDB$INDEX_SEGMENTS ISP
,RDB$INDEX_SEGMENTS ISF
WHERE
FK.RDB$CONSTRAINT_NAME = RC.RDB$CONSTRAINT_NAME
and PK.RDB$CONSTRAINT_NAME = RC.RDB$CONST_NAME_UQ
and ISP.RDB$INDEX_NAME = PK.RDB$INDEX_NAME
and ISF.RDB$INDEX_NAME = FK.RDB$INDEX_NAME
and ISP.RDB$FIELD_POSITION = ISF.RDB$FIELD_POSITION
order by 1, 5
FKTABLE_NAME が外部参照しているテーブルで、参照先がPK_TABLE_NAME になります。
あとはSELECT結果をもとに、外部キーを外したりつけたり。
外す
ALTER TABLE ほげほげテーブル DROP CONSTRAINT INTEG_ほげほげ;
つける
ALTER TABLE ほげほげテーブル
ADD FOREIGN KEY (col1, col2)
REFERENCES ほげほげ参照先テーブル(colA, colB)
外すだけなら
こちらも参考にできそうです。
SQLというよりスクリプトですかね。