[pgsql-jp: 39346] Re: 外部キーにおけるデータ型の相違

ITAGAKI Takahiro itagaki.takahiro @ oss.ntt.co.jp
2008年 4月 22日 (火) 11:55:58 JST


"EBIHARA, Yuichiro" <ebihara @ iplocks.co.jp> wrote:

> 参照性合成制約とデータ型に関する質問です。
> 8.3では以下の通りエラーになります。
> 
> ERROR:  foreign key constraint "child_fk" cannot be implemented
> DETAIL:  Key columns "parent_id" and "id" are of incompatible types:
> numeric and integer.
> 
> これは8.3における仕様変更の影響でしょうか?
> 8.3のリリースノートの以下の記述が当てはまっているように見えますが。
> 「外部キーはデータ型をまたがる参照においてインデックス付け可能な状態に一致しなければならなくなりました。(Tom)
> これは意味的な一貫性を向上させ、また、性能に関する問題を防止する役に立ちます。 」

そうです。
今回のケースでは、「意味的な一貫性」は特に問題ありませんが、
「性能に関する問題」として、integer ⇔ decimal 間で
意図しないキャストが発生し、インデックスが使われない可能性があります。
トラブルを未然に防ぐため、型を揃えることが強制されるようになりました。

ALTER TABLE child ALTER COLUMN parent_id TYPE integer;
などを使って、列の型を変更してはいかがでしょうか。
(この処理の間は、排他ロックが必要です)

------------------------------------------------------------
板垣貴裕 <itagaki.takahiro @ oss.ntt.co.jp>





pgsql-jp メーリングリストの案内