最近のアクセス:
[Nullable] プロパティ - 項目属性

項目属性の値に Null が指定されている場合、「指定されていない」、「使用できない」、または「割り当てられていない」とみなされます。特別な値である「empty」(つまり、数値データでは 0、文字データでは空の文字列など) とは異なります。GeneXus 9.0 から、トランザクションの構造において項目属性が Null 値を持つことができるかどうかを指定できるようになりました。これは、次のような目的の場合に便利です。
  • データの保護
  • 参照整合性コントロールの向上
  • join のパフォーマンスの向上

Null 定義

項目属性の値に Null を指定できるかどうかの変更は、 [ Nullable ] 列のチェックをオンまたはオフにすることによって、トランザクションレベルで行えます。これは、主キー項目属性 (定義により Null 値には非対応) 以外では、元となるテーブルに格納された項目属性すべてについて設定できます。

トランザクションの Nullable 列は次の値を取ることができます:
  • No: 元となるテーブル内の項目属性が Null 値を許可しないことを意味します。
  • Yes: 元となるテーブル内の項目属性が Null 値を許可することを意味します。
  • Compatible: これは互換性を確保するための特別な値であり、GeneXus の 9.0 より前のバージョンから変換されたナレッジベースでのみ利用可能です。詳細については、 [ Null ] プロパティ (GeneXus 9.0) の互換性のセクションをご覧ください。
既定値は No です。
並行トランザクション
並行トランザクションは、任意のレベルにおいて同じ主キーの構成を有するトランザクションです。ナレッジベースに並行トランザクションがある場合、これらにより Null 定義が共有されます。つまり、セットのうち、最後に保存された並行トランザクションが、セット全体の以前の Null 定義を上書きします。
 

Null の重要性

Null は、リレーショナルモデルにおいて大変重要です。任意の項目属性に対して Null 値を許可するということは、値が「設定されていない」ような特定の状況においてこの項目属性が無視されるということです。その一方、項目属性が Null 値を許可しない場合、有効な値が必ず割り当てられる必要があります。Null 情報は GeneXus においてデータベーステーブルおよび参照整合性コントロールの定義に使用され、データベースのナビゲートおよびプログラムの論理の確認に使用される Join タイプを決定します。

データベーステーブル
Null 定義は、GeneXus がナレッジベーステーブルを作成するときに使用されます。各ナレッジベーステーブルのすべての項目属性における Null の機能は、IAR (Impact Analysis Report: 影響分析レポート) に表示されます。Null 定義を変更すると、データベースが強制的に再構成されます。

参照整合性
ナレッジベース内のテーブルは相互に関連しています。テーブル間の相互参照は、外部キーと主キーを通じて行われます。項目属性の Null 定義は、これらの参照がどの程度強力か GeneXus に知らせる外部キーにより構成されます。たとえば、外部キーを構成する項目属性はどれも Null 値を許可しないとします。これは強い参照です (非 Null 参照とも呼ばれます)。これは、何があっても外部キーは参照したテーブルの既存の主キー値をポイントしなければならないことを示しています。一方、Null 値に対応している項目属性が少なくとも 1 つはある外部キーは弱い参照 (Null 参照とも呼ばれます) であり、この項目属性が Null である場合 (項目属性が多くある場合は、そのうちのどれかが Null である場合)、参照は確認されません。

外部キーが複合キー (複数の項目属性を有する) であり、項目属性に Null が許可されている場合、残りの項目属性が次の例のように外部キーを構成していれば、新しい参照を定義できます。
COUNTRY CITY CLIENT
CountryId* CountryId* ClientId*
CountryDsc CityId* ClientName
  CityDsc CountryId
    CityId

CLIENT のトランザクション構造では、CountryId および CityId 項目属性が CITY テーブルの複合外部キーを構成しています。CountryId または CityId のどちらかに Null 値が許可されていない場合は、参照の存在が無条件に検証されます。一方、CityId に Null 値が許可されている場合、CITY のテーブルへの参照は、CityId が Null でない場合にのみ確認され、COUNTRY のテーブルへの参照を作成する必要があります。この参照は、CityId が Null の場合に無効な (存在しない) CountryId を入力することを避けるために必要です。
Join タイプの決定
Join は、データを取り出して要求 (明示的または暗示的な For each の要求) を満たすためにテーブルがどのようにリンクされているかを指します。GeneXus は 2 種類の結合をサポートしています: 自然結合 (Natural Join) と外部結合 (Outer Join) 。Natural は、たとえば、2 つのテーブルを結合する場合、Join の条件に合わないレコードは取り出されないことを意味します。一方、Outer は、結合条件を満たさないレコードが取得されるという意味です。
外部キーの Null 定義に基づいて、GeneXus は Natural (Null 参照ではない) を使用する場合と Outer (Nullable 参照) を使用する場合を判断します。
プログラム論理のチェック
Null 定義は、プログラム論理の確認に使用できます。基本的には、Null 値を許可しない項目属性に Null が設定されないようにします。

ナビゲーションレポート内の Null

ナビゲーションレポートは通常、Null 定義についての情報を示しません。ただし、次のように Null 定義の影響を示します:
  • 「'='」の記号は、Null が許可されている場合 (Outer Join) にテーブルアイコンの前に付加されます。
  • Null を許可する接尾語が、詳細ナビゲーションレポートの READ <TABLE> に付加されます。
  • 「"」の記号は、Null が許可されていない場合 (Natural Join) にテーブルアイコンの前に付加されます。

Null および外部キーのまとめ

  • 外部キーの [ Null ] プロパティがすべての項目属性について No に設定されている場合:
    • 挿入時または更新時に非 Null 参照が許可されます。
    • これらのテーブルを参照する Join は Natural Join として生成されます。
  • 外部キーの一部の Compose 項目属性が Yes に設定されている場合:
    • 挿入または更新時に Null 参照が許可されます。
    • この外部キーの項目属性が別の主キーと一致する場合、新しい参照整合性コントロールが実行されます。
    • これらのテーブルを参照する Join は Outer Join として生成されます。

指定と再構成のコントロール

指定のコントロール

  • プログラム (トランザクションまたはプロシージャー) が、Null 値のプロパティが Yes の参照項目属性を含まず、Initialize Not Referenced 項目属性が No に設定されているテーブルにレコードを挿入する場合、次のエラーメッセージが表示されます:spc0081: Attributes %1 do not allow nulls in table %2 and are not referenced %3.
エラーの修正方法:
  • プログラムがトランザクションである場合は、これらの項目属性をトランザクション構造内で参照するか、該当するレベルでの挿入を無効にします。「error() if insert」ルールを使用してください。
  • プロシージャーの場合は、「New」グループがこれを参照している必要があります。そうでない場合は、これらの項目属性で Null 値を持つことができるプロパティを変更できます。
  • [ Initialize not referenced attributes ] プロパティを Yes に設定してください。
  • Nullvalue() 関数が Null 値に対応していない項目属性に割り当てられており、 [ Generate Nulls for Nullvalue() ] プロパティが Yes に設定されている場合、次のエラーメッセージが表示されます: spc0082: 項目属性 %1 はテーブル %2 で Null を許可しません。
エラーの修正方法:
  • 割り当てを削除して [ Generate Null for Nullvalue() ] プロパティの値を変更します。
  • このテーブルの項目属性が Nullable かどうかを変更します。
  • 外部キーが Null を許可しておらず、これに AllowNulls ルールが指定されている場合は、次のエラーメッセージが表示されます: spc0085: AllowNulls ルールと Null 定義の間で外部キー %1 について競合が発生します。
エラーの修正方法:
  • AllowNulls ルールを削除 (このルールは必須ではありません) し、必要に応じて外部キー項目属性に Null を指定できるかどうかを変更します。

再構成コントロール

Null=Yes の項目属性を Null=No に変更する場合、またはその逆の場合、再構成が行われます。変更された項目属性が外部キーに属する場合、この再構成は外部キー制限の定義を変更できます。項目属性が外部キーに属さない場合は次のとおりです:
  • Null=No から Null=Yes への変更: 新しい値 (Null) が追加されており既存のデータはこの値を持てないため、問題にはなりません。
  • Null=Yes から Null=No への変更: 既存のデータの値が削除される可能性があります。エラーを発生させずにデータを再構成するには、Null 値を [ Initial Value ] プロパティで指定した値に置き換えるか、この値を指定していない場合は、項目属性のデータタイプに対応する空の値に置き換えます。この場合、次の警告が表示されます: Rgz0008: Attribute %1 changed from AllowNulls=Yes to AllowNulls=No and no initial value was specified.Null values will be treated as empty ones.
また、項目属性が外部キーに属する場合、外部キー制限の定義を変更すると、参照整合性のロードプログラムが作成される場合があります。

Null 値を許可しない既存のテーブルに新しい項目属性を定義した場合は、再構成中に次のメッセージが表示されます: Rgz0007: Attribute %1 does not allow nulls and doesn't have a default value.An empty default value will be used.この新しい項目属性が外部キーである場合は、新しい参照整合性の制限も作成されます。その結果、この項目属性に割り当てられた既定値が参照されるテーブルに存在しない場合、再構成は失敗します。この場合は、次のメッセージが表示されます: Reorganization may fail if table %1 has records and the key value %2 does not exist in table %3.

検討事項  

上記のように、外部キーが複合キー (複数の項目属性を有する) であり、項目属性に Null が許可されている場合、残りの項目属性が外部キーを構成していれば、新しい参照を定義できます。 









サブページ
Created: 14/09/18 03:43 by Admin Last update: 21/05/20 04:38 by Admin
カテゴリ
Powered by GXwiki 3.0