1

コードではなく DB 層の問題を修正する必要がありますが、少し複雑です。私はググったが、解決策を見つけることができなかった:(

DB バージョン: Oracle Database 10g Enterprise Edition リリース 10.2.0.3.0 - Prod

さて、複数の行を持つテーブルがあるとしましょう。ただし、現在興味深いのはこれらだけです。

CREATE TABLE "TRANSPORT" 
(   "O_PREFIX" VARCHAR2(3 BYTE), 
    "O_NUMBER" NUMBER(4,0), 
    "O_SUFFIX" CHAR(1 BYTE), 
    "OP_DAYS" VARCHAR2(7 BYTE), 
    "VALID_FROM" DATE, 
    "VALID_TO" DATE, 
);
  • O_PREFIX+O_NUMBER+O_SUFFIX はオーダー ID を次のようにします: AB2000S
  • OP_DAYS: 輸送が行われる日を示します。つまり: 1235 -> 1 日目 (月曜日)、2 日目 (火曜日) などを意味します...毎日出荷する場合は、次のようになります: 1234567、出荷のみの場合月曜日: 1
  • VALID_FROM+VALID_TO: 出荷が行われる範囲を示します。たとえば、VALID_FROM: 01SEP13、VALID_TO: 14OCT13、OP_DAYS が 15 の場合、これは、9 月 1 日から 10 月 14 日までの毎週月曜日と金曜日に発送されることを意味します。

簡単にするために、最初のものを「ID」と呼び、2 番目のものを OP_DAYS のままにし、最後のものを「Range」と呼びます。

重複するレコードが挿入されていないことを確認する必要があります。つまり、ID AND OP_DAYS AND Range が一致しません。

  • ID の一致は簡単です。それらは同じ文字列です。
  • OP_DAYS の一致は、共通の数字があることを意味します。たとえば、この例では "1234" と "456" は一致しますが、"123" と "456" は一致しません。
  • 範囲一致は日付に重複があることを意味するので、例えば「01SEP13-15SEP13」と「10SEP13-01OCT13」は一致しますが、「01SEP13-15SEP13」と「16SEP13-01OCT13」でもOKです。

DB が行の挿入を拒否するには、上記の基準をすべて満たす必要があります。したがって、ID 一致、OP_DAYS マット、および範囲一致が必要であり、この場合、データは拒否されます。

もう 1 つ: OP_DAYS の 7 列を簡単に作成できる場合は、毎日が別の列になります。これは、この変更なしでこの制約を作成することが本当に困難または不可能になる場合にのみです。

4

3 に答える 3

1

データの一貫性を確保するためにトリガーを使用しないでください。データベース側の検証を実行するモジュールを作成します。

于 2013-09-27T14:28:09.483 に答える