SQLServer之FOREIGN KEY约束

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、连接数据库,打开要添加外键的数额表-》右键点击-》选用设计。

图片 1

2、在表设计窗口-》选用要添加外键的数量行-》右键点击-》拔取事关。

图片 2

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

图片 3

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

图片 4

5、在表和列窗口中-》输入外键名-》在左侧采纳主表和涉嫌的列-》在右手选拔从表和当作外键的列-》点击确定。

图片 5

6、在外键关系窗口中-》可接纳丰硕或者不添加外键描述-》可挑选充裕或者不添加修改或者去除数据时级联操作-》可接纳丰硕或者不添加强制外键约束-》可采纳丰盛或者不添加强制用于复制-》点击关闭。

图片 6

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

图片 7

图片 8

运用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

图片 9

在新表中创制外键

 语法:

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

图片 10

FOREIGN KEY约束优缺点

优点:

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

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

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

缺点:

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

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

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

 

相关文章