假设我们有这些表
Person( person_id, name, car_id )
CompanyCar( car_id, make, model, colour, plate )
Person.car_id应该是CompanyCar.car_id的外键,但我希望Person.car_id可以为空,所以当我运行sqlmetal生成linq-to-sql DataContext时,我应该得到
class Person{
int person_id,
string name,
int? car_id,
CompanyCar companyCar //object references may hold null
}
和如果存在,Person.car中应存在Person.car_id。
根据我读过的MSDN文档,这不应该是可能的,但是当我们尝试它时,它可以工作。似乎很少有人在网上写这种关系或询问这种关系。
我可以相信这个外键是强制执行的吗?
更新 以下是我在询问CREATE脚本时生成的SMSS。请注意,FK创建为NOCHECK ,但如果我输入CarID(例如9999),它确实会抱怨我知道在CompanyCar表中不存在。
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Person](
[PersonID] [int] NOT NULL,
[Name] [varchar](100) NOT NULL,
[CarID] [int] NULL
CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED
(
[PersonID] ASC
)WITH FILLFACTOR = 92 ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[Person] WITH NOCHECK ADD CONSTRAINT [FK_Person_CompanyCar] FOREIGN KEY([CarID])
REFERENCES [dbo].[CompanyCar] ([CarID])
GO
(名称不一致的道歉,工作需要示例命名)
答案 0 :(得分:1)
可空列上的FK引用与您希望的完全一样。当存在非NULL值时,将正常强制执行FK约束。 FK约束不会检查NULL值,因为该值当前未知,并且无法确定它是否违反约束。