我正在尝试创建具有除法可能性的表格,并且我希望一行中所有单元格的总和为 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 以外的任何值,则没有必要。为了完成,我将留下这个答案。