假设我们有这些桌子
Person( person_id, name, car_id )
CompanyCar( car_id, make, model, colour, plate )Person.car_id应该是CompanyCar.car_id的外键,但是我希望Person.car_id是可空的,所以当我运行sql来生成linq到sql DataContext时,我应该
class Person{
int person_id,
string name,
int? car_id,
CompanyCar companyCar //object references may hold null
}而如果存在,则Person.car_id应存在于CompanyCar中。
根据我所读过的MSDN文档,这不应该是可能的,但是当我们尝试它时,它起了作用。很少有人会在网上写信或询问这种关系。
--我可以信任这个外键在执行的同时也是可选的吗?
更新:这里是我请求创建脚本时SMSS生成的。注意,FK是作为NOCHECK 创建的,但是如果我输入表中不存在的CarID (例如9999),它确实会发出抱怨。
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(抱歉名称不一致,作业需要示例命名)
发布于 2011-09-15 14:19:01
可空列上的FK引用与您所希望的完全一样。当存在非空值时,通常会强制执行FK约束。FK约束不检查NULL值,因为该值当前未知,无法判断它是否违反了约束。
https://stackoverflow.com/questions/7429351
复制相似问题