实现可选关系(如果FK不为null,则强制执行)

时间:2011-09-15 10:23:28

标签: sql-server linq-to-sql sql-server-2000

假设我们有这些表

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

(名称不一致的道歉,工作需要示例命名)

1 个答案:

答案 0 :(得分:1)

可空列上的FK引用与您希望的完全一样。当存在非NULL值时,将正常强制执行FK约束。 FK约束不会检查NULL值,因为该值当前未知,并且无法确定它是否违反约束。