FOREIGN KEY约束添加规则

1、外键约束并不仅仅可以与另一表的主键约束相链接,它还可以定义为引用另一个表中 UNIQUE 约束的列。

2、如果在 FOREIGN KEY 约束的列中输入非 NULL 值,则此值必须在被引用列中存在;否则,将返回违反外键约束的错误信息。 若要确保验证了组合外键约束的所有值,请对所有参与列指定 NOT NULL。

3、FOREIGN KEY 约束仅能引用位于同一服务器上的同一数据库中的表。 跨数据库的引用完整性必须通过触发器实现。

4、FOREIGN KEY 约束可引用同一表中的其他列。 此行为称为自引用。

5、在列级指定的 FOREIGN KEY 约束只能列出一个引用列。 此列的数据类型必须与定义约束的列的数据类型相同。

6、在表级指定的 FOREIGN KEY 约束所具有的引用列数目必须与约束列列表中的列数相同。 每个引用列的数据类型也必须与列表中相应列的数据类型相同。

7、对于表可包含的引用其他表的 FOREIGN KEY 约束的数目或其他表所拥有的引用特定表的 FOREIGN KEY 约束的数目, 数据库引擎 都没有预定义的限制。 尽管如此,可使用的 FOREIGN KEY 约束的实际数目还是受硬件配置以及数据库和应用程序设计的限制。 表最多可以将 253 个其他表和列作为外键引用(传出引用)。 SQL Server 2016 (13.x) 将可在单独的表中引用的其他表和列(传入引用)的数量限制从 253 提高至 10,000。 (兼容性级别至少必须为 130。)数量限制的提高带来了下列约束:

DELETE 和 UPDATE DML 操作支持大于 253 个外键引用。 不支持 MERGE 操作。

对自身进行外键引用的表仍只能进行 253 个外键引用。

列存储索引、内存优化表和 Stretch Database 暂不支持进行超过 253 个外键引用。

8、对于临时表不强制 FOREIGN KEY 约束。

9、如果在 CLR 用户定义类型的列上定义外键,则该类型的实现必须支持二进制排序。

10、仅当 FOREIGN KEY 约束引用的主键也定义为类型 varchar(max) 时,才能在此约束中使用类型为varchar(max) 的列。

使用SSMS数据库管理工具添加外键约束

本示例演示当表结构已存在时添加外键约束,创建表时添加外键约束步骤和表结构存在时添加外键步骤相同。示例演示如下:

1、连接数据库,打开要添加外键的数据表-》右键点击-》选择设计。

2、在表设计窗口-》选择要添加外键的数据行-》右键点击-》选择关系。

3、在外键关系窗口中-》点击添加。

4、添加完毕后-》首先修改表和列规范。

5、在表和列窗口中-》输入外键名-》在左边选择主表和关联的列-》在右边选择从表和作为外键的列-》点击确定。

6、在外键关系窗口中-》可选择添加或者不添加外键描述-》可选择添加或者不添加修改或者删除数据时级联操作-》可选择添加或者不添加强制外键约束-》可选择添加或者不添加强制用于复制-》点击关闭。

7、点击保存按钮(ctrl+s)-》此时表会弹出警告窗口,点击是-》刷新查看外键是否添加成功。

使用T-SQL脚本添加外键约束

当表结构已存在时

如果要添加约束的表已存在外键约束,需要先删除外键约束再添加外键约束。如果不存在外键约束可以添加外键约束。

语法:

if exists(select * from sysobjects where name=约束名)

alter table 数据库名.[dbo].表名 drop constraint 约束名;

alter table 数据库名.[dbo].表名 with check add constraint 约束名 foreign key(列名)

references 数据库名.[dbo].表名(列名)

on delete cascade

on update cascade;

go

示例:

if exists(select * from sysobjects where name='t1_t2')

alter table [testss].[dbo].[test1] drop constraint t1_t2;

alter table [testss].[dbo].[test1] with check add constraint t1_t2 foreign key(classid)

references [testss].[dbo].[test2](id)

on delete cascade

on update cascade;

go

在新表中创建外键

示例:

if exists( select * from sysobjects where name=表名 and type ='U')

drop table 表名;

go

--当表结构不存在时

--建表语法声明

create table 表名

(

--字段声明

列名 int identity(1,1) not null,

列名 int,

primary key clustered(id asc) with(ignore_dup_key=off) on [primary], --主键索引声明

constraint 外键名 foreign key(列名)

references 主表名(列名)

on update cascade--是否级联操作

on delete cascade

)on [primary]

--字段注释声明

exec sys.sp_addextendedproperty @name=N'MS_Description', @value=N'列说明' , @level0type=N'SCHEMA',

@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'表名', @level2type=N'COLUMN',@level2name=N'列名';

exec sys.sp_addextendedproperty @name=N'MS_Description', @value=N'列说明' , @level0type=N'SCHEMA',

@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'表名', @level2type=N'COLUMN',@level2name=N'列名';

go

示例:

if exists( select * from sysobjects where name='test1'and type ='U')

drop table test1;

go

--当表结构不存在时

--建表语法声明

create table test1

(

--字段声明

id int identity(1,1) not null,

name nvarchar(50) null,

sex nvarchar(50) null,

age nvarchar(50) null,

classid int,

primary key clustered(id asc) with(ignore_dup_key=off) on [primary], --主键索引声明

constraint t3_t4 foreign key(classid)

references test2 (id)

on update cascade

on delete cascade

)on [primary]

--字段注释声明

exec sys.sp_addextendedproperty @name=N'MS_Description', @value=N'id主键' , @level0type=N'SCHEMA',

@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'test1', @level2type=N'COLUMN',@level2name=N'id';

exec sys.sp_addextendedproperty @name=N'MS_Description', @value=N'姓名' , @level0type=N'SCHEMA',

@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'test1', @level2type=N'COLUMN',@level2name=N'name';

exec sys.sp_addextendedproperty @name=N'MS_Description', @value=N'性别' , @level0type=N'SCHEMA',

@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'test1', @level2type=N'COLUMN',@level2name=N'sex';

exec sys.sp_addextendedproperty @name=N'MS_Description', @value=N'年龄' , @level0type=N'SCHEMA',

@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'test1', @level2type=N'COLUMN',@level2name=N'age';

exec sys.sp_addextendedproperty @name=N'MS_Description', @value=N'班级id' , @level0type=N'SCHEMA',

@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'test1', @level2type=N'COLUMN',@level2name=N'classid';

go

FOREIGN KEY约束优缺点

优点:

1、保证数据的一致性,完整性,更可靠。

2、关联查询时,可以用到FK 的统计信息。

3、有主外键的数据库设计可以增加ER图的可读性。

缺点:

1、删队或更新关联数据时需要做检查,效率会很低。

2、手工调数据时,会存在主从表校验,会比较麻烦。

3、批量导入数据时,会存在外键校验,需要先关闭外键约束,导入完成再打开外键约束,操作比较麻烦。

mysql外键约束案例_SQLServer FOREIGN KEY外键约束讲解及使用实例相关推荐

  1. mysql一对一外键约束_MySQL数据库之-foreign key 外键(一对多、多对多、一对一)、修改表、复制表...

    我们在同一数据库创建的表时候,很多时候会出现相同数据的冗余问题,也就是说几个id会有一个或者同n个相同字段,这样就导致数据表结构数据重复冗余, 冗余还无所谓,关键是如果我要改其中一个相同的字段信息,其 ...

  2. 零基础带你学习MySQL—foreign key 外键(二十六)

    零基础带你学习MySQL-foreign key 外键(二十六) -- 外键演示 -- 创建 主表 my_class CREATE TABLE my_class ( id INT PRIMARY KE ...

  3. SQL约束(主键约束 primary key、外键约束 foreign key、唯一约束unique 、CHECK约束)

    注意: A.表中有数据不能创建约束 B.视图下设置后,要点击保存(只有保存后在才看的到) c   别忘了,点刷新,才会出来呀! 1.主键约束 primary key 主键是每行的唯一标识符,仅仅通过它 ...

  4. Mysql 外键详解(Foreign Key)

    文章目录 1 概述 2 语法 2.1 创建表时,添加外键约束 2.2 修改表时,添加外键约束 2.3 删除外键约束 1 概述 #mermaid-svg-b7XqGjZVURw4K7zE .label{ ...

  5. SQL SERVER | 错误处理 INSERT 语句与 FOREIGN KEY SAME TABLE 约束“FK__Course__Cpno__276EDEB3“冲突。(补充)

    项目平台: SQL SERVER 2019 问题描述: 插入语句时受约束,报错: 消息 547,级别 16,状态 0,第 42 行 INSERT 语句与 FOREIGN KEY SAME TABLE ...

  6. 【MYSQL】foreign key 外键约束(详解)

    外键是关联不同表之间的一个联接,比如我们现在有两张表: 那么如何设置外键呢? mysql> create table class(classId int primary key auto_inc ...

  7. mysql foreign key 设置_mysql foreign key(外键) 说明与实例

    一,什么是foreign key,及其完整性 个人觉得,foreign key就是表与表之间的某种约定的关系,由于这种关系的存在,我们能够让表与表之间的数据,更加的完整,关连性更强.关于完整性,关连性 ...

  8. mysql foreign key 用法_mysql foreign key(外键) 说明与实例

    一,什么是foreign key,及其完整性 个人觉得,foreign key就是表与表之间的某种约定的关系,由于这种关系的存在,我们能够让表与表之间的数据,更加的完整,关连性更强.关于完整性,关连性 ...

  9. MySQL数据库之-foreign key 外键(一对多、多对多、一对一)、修改表、复制表

    阅读目录 一.引言: 二.一对多(foreign key) 三.多对多: 四.一对一: 五.修改表: 六.复制表: 摘要: 外键 一对多 外键 多对多 外键 一对一 一.引言: 我们在同一数据库创建的 ...

最新文章

  1. CSS之布局(盒子模型--外边距)
  2. android sdk更新代理设置
  3. Transposed Convolution 反卷积
  4. linux 安装servlet环境_linux下一键搭建LAMP环境安装网站全教程
  5. 爬虫笔记(四)------关于BeautifulSoup4解析器与编码
  6. Swift 团队开源 Collections,提供更多高效数据结构
  7. android面板驱动的使用方法,高通平台Android 驱动层LCD显示屏驱动移植说明和相关工具...
  8. 匈牙利算法寻找最大匹配
  9. 使用freemarker动态设置表格背景色
  10. 教你如何用Three.js创造一个三维太阳系
  11. day04 1113 红与黑(flood fill算法,即DFS,BFS)
  12. 线性代数知识点总结——矩阵乘法、矩阵运算与性质、矩阵微积分
  13. php+js扫码枪实现签到的功能
  14. python分析出nba球员的位置_【圆老司】用python展示NBA球员出手位置偏好
  15. 小米运动app关联支付宝
  16. 网易我的世界服务器怎么显示键盘,电脑版按键操作指南 我的世界电脑版怎么玩...
  17. 2014下半年成长总结
  18. Chrome清除某一个网站的Cookie
  19. 创建永久库和临时库以及@@的作用
  20. BZOJ5084: hashit

热门文章

  1. shell脚本编程 学习笔记
  2. jquery xml 省市区三级联动
  3. Dede Cms系统提示方式修改以及ShowMsg函数说明
  4. gradle依赖子project的指定flavor
  5. 文老师软件设计师-倪奕文-专题视频课程
  6. 南京大学计算机系校庆,南京大学建校100周年庆典邀请函
  7. Set实现数组对象去重
  8. 面向对象——三大基本特征
  9. C++游戏编程:卡牌游戏
  10. 腾讯在前,字节在后,夹缝中的B站靠游戏出圈难