布団が俺を呼んでいる

丘山大一のぶろぐ

Firebird のお勉強 外部参照キーを一時的に取り外したい

う~ん、知識不足が原因の大半なわけですが。
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というよりスクリプトですかね。



Firebird 徹底入門

新品価格
¥4,104から
(2016/7/14 23:43時点)

コメントを書く

布団が俺を呼んでいる | Firebird のお勉強 BULK INSERTの使い方

布団が俺を呼んでいる

丘山大一のぶろぐ

Firebird のお勉強 BULK INSERTの使い方

よくわからなかった個所をお勉強。
あ、Embeded環境です。

使い方

TABLE1の定義はこんな感じ
KEY_ID VARCHAR(8),
NAME VARCHAR(20)

isql.exe
SET NAMES SJIS_0208;
Use CONNECT or CREATE DATABASE to spcify a database
SQL> CONNECT hoge.ftb
CON>user 'SYSDBA' password 'masterkey';
Database: hoge.ftb User: SYSDBA
SQL> SET BULK_INSERT INSERT INTO TABLE1 (?,?);
BULK> (0,0);
BULK> (01,'hoge');
BULK> ('001','hoge');
BULK>
SQL> Commit;

便利そうなところ

普通のINSERT 文では、「'」でくくらないと文字列として扱ってくれません。
そのため、
INSERT INTO TABLE1 (KEY_ID,NAME) VALUES (01,'hoge');
と放り込むと、「01」が「1」と解釈されます。
BULK INSERT では、「'」で囲わなくても、「01」と解釈してくれます。
このあたりは、ファイルから値を入れることを想定した動きのように思えます。

悩みどころ

SJIS_0208 で接続しているためでしょうか、Unicode で定義されていても、SJISで定義されていない文字をINSERT できません。
たとえば、「💛」などは、「?」となります。
ちなみに、普通のInsert文を投げると、「💛」でエラーとなります。
ファイルからデータを入れようと思うと、コレがネックになるおそれがあります。
※正しく入ってくれない + エラーで落ちてくれない のは検証がつらい
UTF-8で接続できれば殆ど解決すると思うのですが……できないのだろうか……。



Firebird 徹底入門

新品価格
¥4,104から
(2016/7/14 23:43時点)

コメント (1) -

SJIS_0208はUnicodeにすべての文字をマップできていないので、
SJIS_0208ではなくcp943cを使うようにしてください。

http://tracker.firebirdsql.org/browse/CORE-1324

コメントを書く