我正在尝试将约束添加到我想要修改的数据库表中。我想在列上添加约束,以便它引用另一个表的主键。很简单,我只需要添加一个外键约束。问题是该列已经有一些值为null或者不属于我将引用的表的一部分。
我的问题是如何添加引用主键的约束,但也可以接受空值(主键始终具有值)以及如何忽略到目前为止的现有值。可能吗?如果第二部分不是,我想我总是可以编写一个脚本来更新所有的废话值(他们有一种排序格式,如果我可以注册)为null,所以他们只需要弄清楚的是如何添加一个也接受空值的外键约束
答案 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);