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、连接数据库,打开要添加外键的数据表-》右键点击-》选择设计。
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、批量导入数据时,会存在外键校验,需要先关闭外键约束,导入完成再打开外键约束,操作比较麻烦。