我正在尝试创建具有划分可能性的表,并且我希望一行中所有单元格的总和为1。 例如:
0.1, 0.2, 0.3, 0.3, 0.1
答案 0 :(得分: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的尝试都会导致约束违规异常。
答案 1 :(得分: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,那么这不是必需的。我只是为了完成而留下这个答案。