4

除算の可能性があるテーブルを作成しようとしていますが、1行のすべてのセルの合計が1になるようにします。例:

0.1, 0.2, 0.3, 0.3, 0.1  
4

2 に答える 2

8

各行が何らかの条件を満たす必要があるテーブルに制約を作成できます。この場合、列の合計は1になります。

create table my_table (
  col1 number,
  col2 number,
  col3 number,
  col4 number,
  constraint assert_sum_is_one check (col1 + col2 + col3 + col4 = 1)
)

行を合計1以外に挿入または更新しようとする、制約違反の例外が発生します。

于 2012-08-15T07:33:09.783 に答える
4

11gを使用している場合は、Oracle仮想列を使用できます。

http://www.oracle-base.com/articles/11g/virtual-columns-11gr1.php

チェック制約と組み合わせて。

CREATE TABLE myTable (
  id          NUMBER,
  col1        NUMBER(3),
  col1        NUMBER(3),
  col3        NUMBER(3),
  colsum      NUMBER GENERATED ALWAYS AS (col1 + col2 + col3) VIRTUAL,
  CONSTRAINT pk_mytable PRIMARY KEY (id)
);

次に、制約を追加して、colsumが常に正確に1であることを確認します。

編集:ボヘミアンの答えはより単純でより良いです。この場合の仮想列の唯一の利点は、合計が常に永続化/表示されることですが、制約によって合計が1以外になることができない場合は、それは必要ありません。完成のために、この答えを残しておきます。

于 2012-08-15T07:31:58.717 に答える