SQLServer之FOREIGN KEY约束

发布时间:2018-12-26  栏目:NoSQL  评论: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地图