首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现可选关系(如果FK不为null,则强制执行)

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

Stack Overflow用户
提问于 2011-09-15 10:23:28
回答 1查看 2.5K关注 0票数 0

假设我们有这些桌子

代码语言:javascript
复制
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时,我应该

代码语言:javascript
复制
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),它确实会发出抱怨。

代码语言:javascript
复制
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

(抱歉名称不一致,作业需要示例命名)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-15 14:19:01

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7429351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档