SQL Server外键关系是强制约束,外键值也可以是空(NULL)
在SQL Server中,实际上外键值可不可以为空(NULL),和外键关系是不是强制约束无关。
我们先在SQL Server数据库中建立两张表People和Car,一个People可以有多个Car,所以这两张表是一对多关系。
建立表
People建表语句:
CREATE TABLE [dbo].[People](
[ID] [int] NOT NULL,
[Name] [nvarchar](50) NULL,
[Age] [int] NULL,
[Sex] [nvarchar](50) NULL,
CONSTRAINT [PK_People] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
其中列ID是People表的主键
Car建表语句:
CREATE TABLE [dbo].[Car](
[ID] [int] NOT NULL,
[Brand] [nvarchar](50) NULL,
[PeopleID] [int] NULL,
CONSTRAINT [PK_Car] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO ALTER TABLE [dbo].[Car] WITH CHECK ADD CONSTRAINT [FK_Car_People] FOREIGN KEY([PeopleID])
REFERENCES [dbo].[People] ([ID])
GO ALTER TABLE [dbo].[Car] CHECK CONSTRAINT [FK_Car_People]
GO
其中列ID是Car表的主键,此外列PeopleID是Car表的外键,其关联People表的主键ID。我们还为People表和Car表之间的外键关系[FK_Car_People]设置了强制约束(CHECK)。
注意上面外键约束[FK_Car_People]中CHECK关键字代表是强制约束,而如果使用NOCHECK关键字代表是非强制约束。
外键关系语法扩展
建立外键关系[FK_Car_People]为强制约束(CHECK)的SQL语句如下:
--下面CHECK关键字表示建立外键关系时就开启强制约束
ALTER TABLE [dbo].[Car] WITH CHECK ADD CONSTRAINT [FK_Car_People] FOREIGN KEY([PeopleID])
REFERENCES [dbo].[People] ([ID])
GO --注意上面建立外键关系[FK_Car_People]后,下面这句ALTER TABLE语句也不能少
ALTER TABLE [dbo].[Car] CHECK CONSTRAINT [FK_Car_People]
GO
建立外键关系[FK_Car_People]为非强制约束(NOCHECK)的SQL语句如下:
--下面NOCHECK关键字表示建立外键关系时不开启强制约束,也就是非强制约束
ALTER TABLE [dbo].[Car] WITH NOCHECK ADD CONSTRAINT [FK_Car_People] FOREIGN KEY([PeopleID])
REFERENCES [dbo].[People] ([ID])
GO --注意上面建立外键关系[FK_Car_People]后,下面这句ALTER TABLE语句也不能少
ALTER TABLE [dbo].[Car] NOCHECK CONSTRAINT [FK_Car_People]
GO
上面建立好外键关系[FK_Car_People]后,可以通过下面的语句再将外键关系[FK_Car_People]改为强制(CHECK)或非强制(NOCHECK)约束,其实就是删除外键关系[FK_Car_People]后再重建:
更改外键关系[FK_Car_People]为强制约束(CHECK)的SQL语句如下:
--删除外键关系[FK_Car_People]
ALTER TABLE [dbo].[Car] DROP CONSTRAINT [FK_Car_People] --下面CHECK关键字表示建立外键关系时就开启强制约束
ALTER TABLE [dbo].[Car] WITH CHECK ADD CONSTRAINT [FK_Car_People] FOREIGN KEY([PeopleID])
REFERENCES [dbo].[People] ([ID])
GO --注意上面建立外键关系[FK_Car_People]后,下面这句ALTER TABLE语句也不能少
ALTER TABLE [dbo].[Car] CHECK CONSTRAINT [FK_Car_People]
GO
更改外键关系[FK_Car_People]为非强制约束(NOCHECK)的SQL语句如下:
--删除外键关系[FK_Car_People]
ALTER TABLE [dbo].[Car] DROP CONSTRAINT [FK_Car_People] --下面NOCHECK关键字表示建立外键关系时不开启强制约束,也就是非强制约束
ALTER TABLE [dbo].[Car] WITH NOCHECK ADD CONSTRAINT [FK_Car_People] FOREIGN KEY([PeopleID])
REFERENCES [dbo].[People] ([ID])
GO --注意上面建立外键关系[FK_Car_People]后,下面这句ALTER TABLE语句也不能少
ALTER TABLE [dbo].[Car] NOCHECK CONSTRAINT [FK_Car_People]
GO
在本例中,外键关系[FK_Car_People]应该是强制约束(CHECK)的,所以下面我们来为People表和Car表插入数据。
插入数据
下面我们为People表插入两条数据:
INSERT INTO [dbo].[People](ID,Name,Age,Sex)
VALUES
(1,N'张三',25,N'男'),
(2,N'李四',26,N'女');
查询结果如下:

然后我们为Car表插入五条数据:
INSERT INTO [dbo].[Car](ID,Brand,PeopleID)
VALUES
(1,N'奔驰',1),
(2,N'宝马',1),
(3,N'大众',2),
(4,N'别克',NULL),
(5,N'丰田',NULL);
注意我们在最后两条数据"别克"和"丰田"中,插入了空值(NULL)到Car表的外键列PeopleID。但是语句并没有报错,五条数据都被成功插入了,查询结果如下:

所以Car表的外键列PeopleID能不能为空(NULL),和其外键关系[FK_Car_People]是不是强制约束(CHECK)无关,它只和Car表允不允许外键列PeopleID为空(NULL)相关。
现在我们把Car表的外键列PeopleID改为不允许为空(NULL),然后再次插入前面的五条数据:
DELETE FROM [dbo].[Car] ALTER TABLE [dbo].[Car]
ALTER COLUMN [PeopleID] INT NOT NULL INSERT INTO [dbo].[Car](ID,Brand,PeopleID)
VALUES
(1,N'奔驰',1),
(2,N'宝马',1),
(3,N'大众',2),
(4,N'别克',NULL),
(5,N'丰田',NULL);
这时插入语句就会报错了,因为此时Car表的外键列PeopleID不能为空(NULL):

所以SQL Server中的外键关系强制约束,约束的实际上是外键的非空值,而外键的空值(NULL)并不受外键强制约束。
SQL Server外键关系是强制约束,外键值也可以是空(NULL)的更多相关文章
- 在SQL Server中实现关系模型的阶梯到级别3的t -SQL DML
在SQL Server中实现关系模型的阶梯到级别3的t -SQL DML 格雷戈里·拉森(Gregory Larsen),2017/08/02(第一次出版:2011 /11/09) 原文链接:http ...
- 在SQL Server中实现关系模型
使用SQL Server的Transact-SQL(T-SQL)方言,此楼梯将为您提供如何使用SQL Server表中的数据的基本了解. DML是数据操作语言,是处理数据的语言的一个方面.它包括SEL ...
- 到T-SQL DML 三级的阶梯:在SQL server中实现关系模型
作者: Gregory Larsen, 2017/08/02 (第一次出版: 2011/11/09) 翻译:谢雪妮,许雅莉,赖慧芳,刘琼滨 译文: 系列 该文章是阶梯系列的一部分:T-SQL DML的 ...
- SQL Server建库-建表-建约束
----------------------------------------SQL Server建库-建表-建约束创建School数据库------------------------------ ...
- SQL Server 按某一字段分组 取 最大 (小)值所在行的数据
SQL Server 按某一字段分组 取 最大 (小)值所在行的数据 -- 按某一字段分组 取 最大 (小)值所在行的数据 -- (爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开) 2007-10-23 ...
- SQL SERVER将某一列字段中的某个值替换为其他的值 分类: MSSQL 2014-11-05 13:11 67人阅读 评论(0) 收藏
SQL SERVER将某一列字段中的某个值替换为其他的值 UPDATE 表名 SET 列名 = REPLACE(列名 ,'贷','袋') SQL SERVER"函数 replace 的参数 ...
- SQL Server 中几种常见的约束关系
1.创建唯一约束 当表中已创建主键,但又要保证其他数据列的值唯一时,可以使用唯一约束,并且唯一约束允许NULL值(只有一个) (1)展开指定的数据库: (2)右击要创建唯一约束的表,在弹出的快捷菜单中 ...
- sql server drop talbe 自动删除关联的外键 ,权限体系(一)
if object_id('Proc_DropTableWithFK') is not null begin drop proc dbo.Proc_DropTableWithFK end GO ) a ...
- 【2017-03-09】SQL Server 数据库基础、四种约束
一.数据库和内存的区别 数据库:一些存储在硬盘上的数据文件 内存:计算机临时存储的一些数据 二.常用数据库 .Net - SQL Server PHP - MySql Java - Oreacl 三. ...
随机推荐
- 【JavaScript】案例三:使用JS完成页面定时弹出广告——事件(onload)
事件(onload) *注意点: 变量加var局部变量,不加var全局变量 setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭. 返回值:返回 ...
- vue-cli3.0结合lib-flexible、px2rem实现移动端适配,完美解决第三方ui库样式变小问题
公司最近做的一个移动端项目从搭框架到前端开发由我独立完成,以前做移动端适配用的媒体查询,这次想用点别的适配方案,然后就采用了vue-cli3.0结合lib-flexible.px2rem实现移动端适配 ...
- CentOS7.5下实现MySQL5.7主从同步
这里使用两台Linux主机(一台充当MySQL主服务器,另一台充当MySQL从服务器),MySQL用yum安装,版本均为5.7,下表是它们所使用的操作系统以及IP地址. 两台Linux主机所使用的操作 ...
- 从架构开始谈dubbo(一)
架构发展史 一.单体应用架构 当网站流量很小时,所有的功能写在一个项目中,打包部署在tomcat中. 例如:公司管理系统,超市的收银系统 也可以将单体应用部 ...
- 2014-2015 ACM-ICPC, Asia Tokyo Regional Contest
2014-2015 ACM-ICPC, Asia Tokyo Regional Contest A B C D E F G H I J K O O O O O O A - Bit ...
- Excel 使用小技巧
连接符,符号是&,输入方式为按住Shift+7“&”在连接单元格内容时,不管单元格格式为文本还是数值,都能连接,但得到的结果都是文本型数字. ="update tb_reco ...
- 前端 / JavaScript 导出PDF的实践
1.库:jspdf,自己定义一个高宽,如A4的210mm×297mm 2.让设计给背景图(包括:页眉页脚),水印图(背景透明,高宽和你的PDF单页一致)以及很多,能设计给的设计要给,因为在pdf上,排 ...
- 【组合数学】【P5520】[yLOI2019] 青原樱
A [yLOI2019] 青原樱 Background 星川之下皆萤火尘埃 我独行在人潮你天真而待 相遇若是借丹青着色 青原上 绯樱如海 --银临<青原樱>(Cover 人衣大人) Des ...
- 测试之selenium简介
目录 selenium是什么? 应该具备的知识 Selenium功能特性 Selenium的局限性 Selenium与QTP比较 Selenium工具套件 Selenium集成开发环境(IDE) Se ...
- JavaScriptDOM编程学习笔记(二)图片库案例
<JavascriptDOM编程艺术>提供一个图片库的demo,主要讲解如何更好的使用JavaScript在网页中,跟随作者的思路来分析一下这个案例 首先需求是将图片发布到网上,但是如果发 ...