SQLServer之FOREIGN KEY约束

发布时间:2018-12-26  栏目:MySQL  评论:0 Comments

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) 的列。

PRIMARY KEY约束添加规则

1、在表中常有一列或多列的重组,其值能唯一标识表中的每一行,这样的一列或多列成为表的主键(PrimaryKey)。

2、一个表只可以有一个主键,而且主键约束中的列不可能为空值。

3、只有主键列才能被视作另外表的外键所开创。

4、一般情形下一个表中只好有一个主键。

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

本示例演示当表结构已存在时添加外键约束,创立表时加上外键约束步骤和表结构存在时添加外键步骤一样。示例演示如下:

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

图片 1

2、在表设计窗口-》选用要添加外键的多少行-》右键点击-》采纳涉及。

图片 2

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

图片 3

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

图片 4

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

图片 5

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

图片 6

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

图片 7

图片 8

运用SSMS数据库管理工具添加主键约束

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

采纳SSMS数据库管理工具添加一列作为一个主键约束

1、连接数据库,选拔数据表-》右键点击,拔取设计。

图片 9

2、在新窗口中,采用一行,右键点击-》选取设置主键-》点击保存按钮(或者ctrl+s)。

图片 10

3、刷新表查看示例结果。

图片 11

 

当表结构已存在时

假如要丰盛约束的表已存在外键约束,需要先删除外键约束再添加外键约束。即便不设有外键约束可以加上外键约束。

语法:

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

图片 12

应用SSMS数据库管理工具添加多列作为一个主键约束

1、连接数据库,采用数据表-》右键点击-》拔取设计。

图片 13

2、在新窗口中-》按下ctrl键,采取多行-》右键点击-》选拔安装主键-》点击保存(或者ctrl+s)。

图片 14

3、刷新表查看示例结果。

图片 15

在新表中制造外键

 语法:

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

图片 16

采用T-SQL脚本添加主键约束

FOREIGN KEY约束优缺点

优点:

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

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

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

缺点:

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

2、手工调数据时,会存在主从表校验,会相比劳碌。

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

 

利用T-SQL脚本添加一列作为一个主键约束

当表中约束存在时,不能够平素抬高主键约束,因为一张表只允许存在一个主键约束,尽管需要加上主键约束需要先删除已存在的主键约束再添加主键约束。当表中不存在主键约束时,可直接抬高主键约束。

语法:

if exists(select * from sysobjects where
name=约束名)
alter table 数据库名.[dbo].表名 drop
constraint 约束名;
alter table 数据库名.[dbo].表名 add
constraint 约束名 primary key(列名 [asc|desc]);

示例:

–假设封锁存在则删除约束,如若封锁不设有则不删除
if exists(select * from sysobjects where
name=’idcon2′)
alter table [testss].[dbo].[test1]
drop constraint idcon2;
–添加封锁
alter table [testss].[dbo].[test1]
add constraint idcon2 primary key(id asc);

图片 17

图片 18

利用T-SQL脚本添加多列作为一个主键约束

当表中约束存在时,不可以直接助长主键约束,因为一张表只允许存在一个主键约束,固然需要添加主键约束需要先删除已存在的主键约束再添加主键约束。当表中不设有主键约束时,可径直助长主键约束。

语法:

–添加多列主键约束

if exists(select * from sysobjects where
name=约束名)
alter table 数据库名.[dbo].表名 drop
constraint 约束名;
alter table 数据库名.[dbo].表名 add
constraint 约束名 primary
key(列名 [asc|desc],列名 [asc|desc],……);

示例:

–添加多列主键约束
if exists(select * from sysobjects where
name=’idcon2′)
alter table [testss].[dbo].[test1]
drop constraint idcon2;
–添加封锁
alter table [testss].[dbo].[test1]
add constraint idcon2 primary key(id asc,name desc);

图片 19

PRIMARY KEY约束优缺点

优点:

1、简单、效率高。 

2、保证数据完整性。

3、不会有空值。

4、不同意存在双重值。

缺点:

1、主键自增一般采纳int型,有多少条数的界定。

2、在数据库举办数量统一时会比较勤奋。 

 

留下评论

网站地图xml地图