如果给定条件为真,有没有办法忽略唯一约束?
例如,我的数据库中有 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 不存在 |
听起来您已经尝试将两张或更多张桌子挤成一张桌子。
例如,如果你制作了一个大的平面文件,你可能会有这个?
一种 | 乙 | 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] 删除。
我来说两句