条件唯一约束 SQL

纳克

如果给定条件为真,有没有办法忽略唯一约束?

例如,我的数据库中有 3 列形成了一个唯一约束:

create table example_table
  (
    column_primarykey RAW(16) default NULL not null,
    column_a number(8) not null,
    column_b number(8) not null,
    column_c number(8) not null,
    constraint constraint_1
          unique(column_a, column_b, column_c)
    constraint constraint_2
          primary key (column_primarykey)

现在我添加第四列:

alter table example_table
      add column_d number(8) not null,

我想要实现的是,如果 column_d 的值已存在于表中,则唯一约束将被忽略。如果 column_d 在表中不是唯一的,则唯一约束将被忽略,您可以将该行添加到表中。例如,这是我表中的现有数据(忽略不相关的主键原因):

列_a 列_a 列_c 列_d
1 2 3 1
3 4 5 2

所以我想要的是你可以添加例如 (1, 2, 3, 1) 但不能添加 (1, 2, 3, 2) 因为已经有一行包含前三个值。只有在 column_d 中的值已经存在并且其他值等于现有行时才可能。

更多帮助理解的例子:

示例插入 结果 原因
(1, 2, 3, 1) 公认 d 不是唯一的,并且 a、b、c 的值与 column_d 的值为 1 的现有行相同
(1, 2, 3, 4) 拒绝了 a, b,c 已经存在于表中
(5,6,7,1) 拒绝了 1 存在,但 ab 和 c 的值不同
(3,4,5,2) 公认 d 存在且 a、b、c 具有相同的值
(7,8,9,3) 公认 a、b、c 是唯一的,d 不存在
MatBailie

听起来您已经尝试将两张或更多张桌子挤成一张桌子。

  • 没有更多背景很难说

例如,如果你制作了一个大的平面文件,你可能会有这个?

一种 C d X
1 2 3 1 1 3 1
1 2 3 1 2 8 7
1 2 3 1 5 9 2
4 5 6 2 9 8 7
4 5 6 2 4 5 6
4 5 6 2 3 2 1
4 5 6 2 2 1 0

不过,数据库不是电子表格或平面文件,它们是关系结构。

上面的文件在数据库中可能会更好地表示为两个表......

一种 C d
1 2 3 1
4 5 6 2
d X
1 1 3 1
1 2 8 7
1 5 9 2
2 9 8 7
2 4 5 6
2 3 2 1
2 2 1 0

如果你想要一个新的“数据”行,你可以在第二个表中添加一行。

如果要在(a,b,c)之间创建新关系(d),请向第一个表中添加一行。


可以按如下方式实施和强制执行...

CREATE TABLE map (
    column_a       NUMBER(8) NOT NULL,
    column_b       NUMBER(8) NOT NULL,
    column_c       NUMBER(8) NOT NULL,
    column_d       NUMBER(8) NOT NULL,
    UNIQUE(column_a, column_b, column_c),
    UNIQUE(column_d)
)

CREATE TABLE fact (
    column_pk      RAW(16)   NOT NULL,
    column_d       NUMBER(8) NOT NULL,
    column_x       NUMBER(8) NOT NULL,
    column_y       NUMBER(8) NOT NULL,
    column_z       NUMBER(8) NOT NULL,
    PRIMARY KEY (column_pk),
    FOREIGN KEY (column_d) REFERENCES map(column_d)
)

据我所知,这个结构可以包含您想要允许的所有内容,并禁止您想要禁止的所有内容。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章