SQLServer之FOREIGN KEY约束 FOREIGN KEY约束添加规则 使用SSMS数据库管理工具添加外键约束 使用T-SQL脚本添加外键约束 FOREIGN KEY约束优缺点

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

若要确保验证了组合外键约束的所有值,请对所有参与列指定 NOT NULL。

此行为称为自引用。

此列的数据类型必须与定义约束的列的数据类型相同。

每个引用列的数据类型也必须与列表中相应列的数据类型相同。

(兼容性级别至少必须为 130。)数量限制的提高带来了下列约束:

不支持 MERGE 操作。

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

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

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

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

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

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

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

SQLServer之FOREIGN KEY约束
FOREIGN KEY约束添加规则
使用SSMS数据库管理工具添加外键约束
使用T-SQL脚本添加外键约束
FOREIGN KEY约束优缺点

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

SQLServer之FOREIGN KEY约束
FOREIGN KEY约束添加规则
使用SSMS数据库管理工具添加外键约束
使用T-SQL脚本添加外键约束
FOREIGN KEY约束优缺点

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

SQLServer之FOREIGN KEY约束
FOREIGN KEY约束添加规则
使用SSMS数据库管理工具添加外键约束
使用T-SQL脚本添加外键约束
FOREIGN KEY约束优缺点

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

SQLServer之FOREIGN KEY约束
FOREIGN KEY约束添加规则
使用SSMS数据库管理工具添加外键约束
使用T-SQL脚本添加外键约束
FOREIGN KEY约束优缺点

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

SQLServer之FOREIGN KEY约束
FOREIGN KEY约束添加规则
使用SSMS数据库管理工具添加外键约束
使用T-SQL脚本添加外键约束
FOREIGN KEY约束优缺点

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

SQLServer之FOREIGN KEY约束
FOREIGN KEY约束添加规则
使用SSMS数据库管理工具添加外键约束
使用T-SQL脚本添加外键约束
FOREIGN KEY约束优缺点

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

SQLServer之FOREIGN KEY约束
FOREIGN KEY约束添加规则
使用SSMS数据库管理工具添加外键约束
使用T-SQL脚本添加外键约束
FOREIGN KEY约束优缺点

SQLServer之FOREIGN KEY约束
FOREIGN KEY约束添加规则
使用SSMS数据库管理工具添加外键约束
使用T-SQL脚本添加外键约束
FOREIGN KEY约束优缺点

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

SQLServer之FOREIGN KEY约束
FOREIGN KEY约束添加规则
使用SSMS数据库管理工具添加外键约束
使用T-SQL脚本添加外键约束
FOREIGN KEY约束优缺点

在新表中创建外键

 语法

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

SQLServer之FOREIGN KEY约束
FOREIGN KEY约束添加规则
使用SSMS数据库管理工具添加外键约束
使用T-SQL脚本添加外键约束
FOREIGN KEY约束优缺点

FOREIGN KEY约束优缺点

优点:

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

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

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

缺点:

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

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

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