4

我正在尝试创建具有除法可能性的表格,并且我希望一行中所有单元格的总和为 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 回答