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

And*_*eou 1 sql oracle null constraints foreign-keys

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

我的问题是如何添加引用主键但也可以接受空值(主键始终有值)的约束以及如何忽略迄今为止的现有值。是否可以?如果第二部分不是,我想我总是可以编写一个脚本来将所有无意义值(它们有一种格式,如果我可以 reg ex)更新为 null,所以我唯一需要弄清楚的是如何添加也接受空值的外键约束

Jef*_*emp 5

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

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

ALTER TABLE x ADD CONSTRAINT fk FOREIGN KEY (id) REFERENCES parent (id) NOVALIDATE;
Run Code Online (Sandbox Code Playgroud)

使用该NOVALIDATE选项的唯一缺点是查询优化器不会依赖 FK 约束,并且会假设可能存在没有匹配父行的行来执行查询。

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