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、批量导入数据时,会是外键校验,需要先关外键约束,导入好还打开外键约束,操作比较辛苦。

 

相关文章