可以为空的外键的优点

时间:2010-08-27 21:08:30

标签: sql foreign-keys conventions

我需要为一些新组件构建一个表,以跟踪可用和已用库存。它将是这样的:

CREATE TABLE components
(
   component_Id int NOT NULL PRIMARY KEY,
   workOrder_Id int FOREIGN KEY,
   componentSerial varchar(25) NOT NULL,
   foo varchar(50),
   bar int,
   information nvarchar(250)
   date DateTime
)

当FOREIGN KEY workOrderID尚未使用而不是NOT NULL并且默认值为0时,有什么优势可以使其可以为空? 对我来说让它可以为空是更有意义的。

我看了一些类似的情况,但我不确定为什么有人会选择一个而不是另一个。

2 个答案:

答案 0 :(得分:9)

如果您的外键的默认值为0,则表示您必须始终保持ID为0的workOrder的存在,作为未引用的组件引用的伪工作订单。这是一个非常难看的黑客。

(假设您的FOREIGN KEY实际上是一个正确的强制外键,这绝对是可取的,但如果您使用MyISAM就不会发生。这个例子对我不起作用,只是单独说FOREIGN KEY而没有指定REFERENCES哪个列不是有效的SQL。)

如果您不喜欢NULL,则替代解决方案是将组件映射到workOrders的连接表,并在component_Id上使用UNIQUE约束。

答案 1 :(得分:6)

可空外键的优点与任何其他可空列的优点相同:如果您没有已知或适用的值存储在给定行中,您可以使用NULL而不是选择“特殊值”没有价值。