ホーム › フォーラム › A5:SQL Mk-2掲示板 › DDL生成時の外部キー制約の出力順序
- このトピックには12件の返信、1人の参加者があり、最後にhurricaneにより1年、 10ヶ月前に更新されました。
-
投稿者投稿
-
hurricaneゲスト
いつも大変便利に使用させていただいております。
新規 > ER図 よりER図を作成し、DDLを生成する際に、外部キー制約の出力順序がまちまちになるのですが、何かしらの方法で常に同じ順序で出力することは不可能でしょうか?◆バージョン
2.16.1(x64 edition)◆操作
ER図 > DDLを作成する
RDBMS種類:PostgreSQL
テーブル生成順序:依存関係順(依存する方が先)
リレーションシップからファイブキー制約を作成する:true
外部キー名:%0:s_FK%1:d
◆ある時の外部キー制約出力順序
ALTER TABLE “public”.”test”
ADD CONSTRAINT “test_FK1” FOREIGN KEY (“member_id”) REFERENCES “public”.”member”(“id”);ALTER TABLE “public”.”test”
ADD CONSTRAINT “test_FK2” FOREIGN KEY (“team_id”) REFERENCES “public”.”team”(“id”);◆またある時の外部キー制約出力順序
ALTER TABLE “public”.”test”
ADD CONSTRAINT “test_FK1” FOREIGN KEY (“team_id”) REFERENCES “public”.”team”(“id”);ALTER TABLE “public”.”test”
ADD CONSTRAINT “test_FK2” FOREIGN KEY (“member_id”) REFERENCES “public”.”member”(“id”);松原正和キーマスターhurricane さんこんにちは。
基本的に外部キーの生成順序は、単に内部的に持っているオブジェクトの配列の順序で生成されます。
(実質的には、描画時に手前になる方あるいは、後からおいた方が先にDDLに出力されます。)hurricaneゲストご返答ありがとうございます。
外部キー制約の生成順序に関する規則性については、理解いたしました。
しかしながら、次のようなストーリーで問題が発生します。1.ER図を作成し、DDLバージョン1として出力する。
2.ER図を編集し、DDLバージョン2として出力する。このとき、2の編集ではテーブルを追加したのみです。
ですが、関係ないテーブルの外部キーの出力順が変わってしまいます。
(内部的に持っているオブジェクトの配列順序がなぜ変わってしまっているのか不明)これにより、バージョン1で作成したDBをバージョン2へ更新する差分変更SQLに、本来は不要な外部キー制約の名前の付け替えが発生してしまいます。
できればアルファベット順等で生成できるようになるか、あるいはせめて内部的に持っているオブジェクトの配列順序を一覧表示し、好みの順序に並び変えれるようにはできませんでしょうか。
何卒ご検討よろしくお願いいたします。
hurricaneゲスト補足いたします。
エンティティの物理名を変更した際に順序が大きく崩れるようです。
—
例えば、あるテーブル(他テーブルとのリレーション無し)のエンティティを複製した場合、「NEW_ENTITY1」という名前で追加されますが、この時点ではDDL出力しても正常にテーブル追加分しか差分が発生しません。
—
ところがこの「NEW_ENTITY1」を「test」などに物理名を変更した後にDDL出力を行うと、大量の外部キー制約の差分が発生します。
—
※前述の通り、たしかに、外部キー制約のテーブルごとの出力順は一定です。しかし、一つのテーブルごとの「”tbl1_FK1″」「”tbl1_FK2″」「”tbl1_FK3″」等の出力順が滅茶苦茶になります。hurricaneゲスト何度も連投してしまい申し訳ありません。
CONSTRAINT “tbl1_FK1” FOREIGN KEY (“member_id”) REFERENCES “member”(“id”);
CONSTRAINT “tbl1_FK2” FOREIGN KEY (“team_id”) REFERENCES “team”(“id”);
CONSTRAINT “tbl2_FK1” FOREIGN KEY (“user_id”) REFERENCES “user”(“id”);
↑が↓のようになることはないが
CONSTRAINT “tbl2_FK1” FOREIGN KEY (“user_id”) REFERENCES “user”(“id”);
CONSTRAINT “tbl1_FK1” FOREIGN KEY (“member_id”) REFERENCES “member”(“id”);
CONSTRAINT “tbl1_FK2” FOREIGN KEY (“team_id”) REFERENCES “team”(“id”);
hurricaneゲスト
CONSTRAINT “tbl1_FK1” FOREIGN KEY (“member_id”) REFERENCES “member”(“id”);
CONSTRAINT “tbl1_FK2” FOREIGN KEY (“team_id”) REFERENCES “team”(“id”);
CONSTRAINT “tbl2_FK1” FOREIGN KEY (“user_id”) REFERENCES “user”(“id”);
↑が↓のようになってしまい、DDLに大量の差分が発生してしまいます。
CONSTRAINT “tbl1_FK1” FOREIGN KEY (“team_id”) REFERENCES “team”(“id”);
CONSTRAINT “tbl1_FK2” FOREIGN KEY (“member_id”) REFERENCES “member”(“id”);
CONSTRAINT “tbl2_FK2” FOREIGN KEY (“user_id”) REFERENCES “user”(“id”);
こちらは不具合なような気がするのですが、いかがでしょうか。
大変お忙しいところご迷惑おかけしますがご確認をよろしくお願いいたします。hurricaneゲスト何度も連投してしまい大変申し訳ありません。
気が付いたのですが、「外部キーの出力順」というよりは、「外部キーの連番の採番順」という方が表現が正しいですね。
外部キー名「%0:s_FK%1:d」(%0:sはテーブル名、%1:dは連番)
という仕様において、連番の採番順が一意ではないようです。
松原正和キーマスターhurricane さんこんにちは。
同じテーブル内でのFKの順序ということでしょうか? ちょっと今週末はそこまで手が付けられなかったので、もう少々お待ちください。hurricaneゲスト松原さんこんにちは
> 同じテーブル内でのFKの順序ということでしょうか?
仰る通りです。
> ちょっと今週末はそこまで手が付けられなかったので、もう少々お待ちください。
はい、ありがとうございます。よろしくお願いします。
松原正和キーマスターhurricane さんこんにちは。
現状、外部キーのDDLはER図の配置順に出力されます。手前側に配置されたリレーションシップから先に外部キーとして出力されます。
なので、リレーションシップの線の順序を変えなければ外部キーの出力順序も変わらないはずです。hurricaneゲストお返事ありがとうございます。
「.a5m2」ファイルをテキストエディタで開きZOrder等も確認しましたが、やはりどうしても配置に関わらず外部キー出力順が変わっていると思われるので、再現できるa5m2プロジェクトファイルを用意しました。
https://3.gigafile.nu/0127-c7cc3b7a7883f15258c7e5da398e944e1
(ダウンロードキー:a5m2)A.Sample1.a5m2:テーブル追加前のプロジェクト
B.sample1.sql:Aから出力したDDL
C.Sample2.a5m2:テーブル追加後のプロジェクト
D.sample2.sql:Cから出力したDDLAとCをWinMergeで比較すると、テーブル追加分の差分しか出ず、ZOrderも問題無いように見えますが、BとDを比較すると外部キー出力順に差が発生します。
補足で、差分比較とDDL出力時の設定値の画像も同梱してあります。
お忙しいところ申し訳ないですが確認していただけると嬉しいです。よろしくお願いいたします。
松原正和キーマスターhurricane さんこんにちは。
ありがとうございます。再現できました。DDLの生成を依存関係順にしていた時の並べ替えで、非安定なソートを使っていたために、DDLの生成順序に変化が起きてしまったようでした。親・子のテーブルが同じリレーションシップがあった場合、配置した順序で外部キーを生成するようにソートの比較関数を修正しました。
Version 2.18.0 beta 40 で直しましたのでご確認いただければと思います。hurricaneゲストあけましておめでとうございます。
確認、修正ありがとうございました。beta40にて修正されていることを確認しました。
ありがとうございました。本年もA5M2を応援しております!
-
投稿者投稿