除算の可能性があるテーブルを作成しようとしていますが、1行のすべてのセルの合計が1になるようにします。例:
0.1, 0.2, 0.3, 0.3, 0.1
除算の可能性があるテーブルを作成しようとしていますが、1行のすべてのセルの合計が1になるようにします。例:
0.1, 0.2, 0.3, 0.3, 0.1
各行が何らかの条件を満たす必要があるテーブルに制約を作成できます。この場合、列の合計は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以外に挿入または更新しようとすると、制約違反の例外が発生します。
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以外になることができない場合は、それは必要ありません。完成のために、この答えを残しておきます。