忽略空值或历史值的Oracle SQL外键约束

时间:2014-11-17 14:16:44

标签: sql oracle null foreign-keys constraints

我正在尝试将约束添加到我想要修改的数据库表中。我想在列上添加约束,以便它引用另一个表的主键。很简单,我只需要添加一个外键约束。问题是该列已经有一些值为null或者不属于我将引用的表的一部分。

我的问题是如何添加引用主键的约束,但也可以接受空值(主键始终具有值)以及如何忽略到目前为止的现有值。可能吗?如果第二部分不是,我想我总是可以编写一个脚本来更新所有的废话值(他们有一种排序格式,如果我可以注册)为null,所以他们只需要弄清楚的是如何添加一个也接受空值的外键约束

2 个答案:

答案 0 :(得分:3)

首先,没有什么可以阻止您在具有NULL的列上添加引用约束 - 仅对非NULL值强制执行外键约束。

其次,如果父表中不存在现有值,并且您无法修复它们,那么Oracle中的选项可以使用{仅对新插入或更新的行验证约束',使用{ {1}}选项,例如

NOVALIDATE

使用ALTER TABLE x ADD CONSTRAINT fk FOREIGN KEY (id) REFERENCES parent (id) NOVALIDATE; 选项的唯一缺点是查询优化器不依赖于FK约束,并且会假设可能存在没有匹配父行的行来执行查询。 / p>

如果您能够修复缺失值,然后将约束更改为NOVALIDATE,那将是一个好主意。

答案 1 :(得分:0)

主键不能在所有数据库中包含NULL值(proof

要添加外键,您应该执行以下操作:

ALTER TABLE table1
ADD CONSTRAINT fk_table1_2
FOREIGN KEY (column1)
REFERENCES table2(column2);