一意制約の詳細

最終更新日: 2020年3月14日
R8 | R9

データベースによる挙動の違い

一意制約設定を行った項目の一部を未入力(null)として保存した場合の動作は、データベースによって異なります。

項目A, B, Cに一意制約を定義します。ここで A:aaa, B:null, C:ccc というデータを登録します。 その後、A:aaa, B:null, C:ccc のデータを再び登録しようとすると、次のようになります。

内蔵データベース(HSQLDB)、PostgreSQL
登録可能。
SQLServer
一意制約違反で登録に失敗する。

詳細は、ご利用のデータベースのマニュアルをお読みください。

生成されるDDL

ここで指定した一意制約の設定は、次のファイルで確認できます。

wagbydesigner/webapps/wagbydesigner/WEB-INF/env/work/dbschema/createddl/モデルID.ddl

テキストエディタでファイルの内容を確認することができます。次の DDL が含まれています。

alter table "モデルID"
   add constraint jfcuk_モデルID_設定した名前 unique ("項目名");

init_db.bat を実行すると、この alter 文も同時に実行されます。

一意制約名の自動調整

一意制約名は、利用するデータベースが許可する制約名の最大長に合わせて調整されます。

具体的には最大長を超える名前の場合、短縮されます。(短縮の結果、重複する場合には、これを重複しないように一意な名前を割り当てます。これはテーブル名や項目名でも同様です。)

仕様・制約

テーブルの作成が必要

「テーブルを作成する」を無効にしたモデルに一意制約を設定することはできません。(一意制約はデータベースの機能を利用しているためです。)

サブモデル

サブモデルに設定することはできません。メインモデルに設定して下さい。(つまりメインモデルとサブモデルで異なる一意性制約を設定することはできません。)

繰り返しコンテナと一意制約の関係

繰り返しコンテナ内の複数の項目に対して、一意制約を設定することができます。しかし次の場合は設定することができません(設定してもエラーとなるか、一意制約が有効になりません。)

  • 繰り返しコンテナID項目に、一意制約を設定することはできない。
  • 繰り返しコンテナを含むモデルの主キー項目と、繰り返しコンテナ内項目の組み合わせで一意制約を設定することはできない。
  • 繰り返しコンテナ外の項目と、繰り返しコンテナ内項目の組み合わせで一意制約を設定することはできない。
  • 繰り返しコンテナの「コンテナ内でソートする」機能を有効にした場合、繰り返しコンテナ内の項目に一意制約を設定することはできない。
※ 上記以外にも設定できない組み合わせがある可能性があります。念のため動作をご確認ください。

回避策

Wagbyが標準で提供している一意制約を使わず、スクリプトの利用で回避してください。(スクリプトでデータをチェックし、ユニーク性を確認します。)