SQLServer之FOREIGN KEY约束

图片 17

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
约束的骨子里多少照旧受硬件配备以致数据库和应用程序设计的限量。 表最多能够将 251个其余表和列作为外键援引(传出援用)。 SQL
Server 二零一六 (13.x) 将可在单身的表中援用的任何表和列(传入引用)的数码节制从
253 提升至 10,000。 (宽容性等级起码必须为
130。)数量约束的滋长带来了下列约束:

DELETE 和 UPDATE
DML 操作援助胜出 253 个外键引用。 不援助ME大切诺基GE 操作。

对自身进行外键援引的表仍只好进行 251个外键引用。

列存款和储蓄索引、内部存款和储蓄器优化表和 Stretch Database
暂不支持开展超过 253 个外键援用。

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

9、倘若在 CL奥德赛客户定义类型的列上定义外键,则该类型的落实必需扶助二进制排序。

10、仅当 FOREIGN
KEY
限定援用的主键也定义为项目 varchar(max) 时,本事在那约束中运用项目为varchar(max) 的列。

DEFAULT节制增添准绳

1、若在表中定义了私下认可值限定,客商在插入新的数目行时,要是该行没有一点名数量,那么系统将暗中同意值赋给该列,假若我们不安装暗许值,系统默感觉NULL。

2、假使“暗许值”字段中的项替换绑定的暗中同意值(以不带圆括号的款型体现),则将唤起您扫除对暗许值的绑定,并将其替换为新的暗中认可值。

3、若要输入文本字符串,请用单引号 (‘)
将值括起来;不要采取双引号
(“),因为双引号已封存用于带引号的标志符。

4、若要输入数值默许值,请输入数值况兼永不用引号将值括起来。

5、若要输入对象/函数,请输入对象/函数的称号并且毫不用引号将名称括起来。

动用SSMS数据库管理工科具增加外键约束

本示例演示当表结构已存在时增多外键节制,创制表时加上外键节制步骤和表结构存在时增添外键步骤雷同。示例演示如下:

1、连接数据库,张开要增添外键的数目表-》右键点击-》选用设计。

图片 1

2、在表设计窗口-》选用要增多外键的数码行-》右键点击-》选拔事关。

图片 2

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

图片 3

4、增多达成后-》首先改正表和列规范。

图片 4

5、在表和列窗口中-》输入外键名-》在左侧选拔主表和事关的列-》在侧面选用从表和作为外键的列-》点击明确。

图片 5

6、在外键关系窗口中-》可选拔充裕也许不增加外键描述-》可采用丰硕或许不增添修正恐怕去除数据时级联操作-》可选择丰裕或许不添抓实制外键约束-》可接纳充足只怕不添狠抓制用于复制-》点击关闭。

图片 6

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

图片 7

图片 8

动用SSMS数据库处理工科具增添DEFAULT限制

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

图片 9

2、在表设计窗口中-》接收数据列-》在列属性窗口中找到暗许值或绑定-》输入暗中同意值(注意默许值的数据类型和输入格式)。

图片 10

3、点击保存开关(或许ctrl+s)-》刷新表-》再度展开表查看结果。

图片 11

接纳T-SQL脚本增多外键约束

采用T-SQL脚本加多DEFAULT约束

当表结构已存在时

只要要加上约束的表已存在外键约束,需求先删除此之外键节制再加多外键限制。假设不设有外键节制能够加上外键约束。

语法:

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

当表结构已存在时

率先判别表中是或不是存在暗中认可约束,如若存在则先删除私下认可约束再加多,假若不设有则一向抬高。

语法:

use 数据库
go
–推断暗中认可限制是不是存在,即使存在则先删除,假诺海市蜃楼则直接助长
if exists(select * from sysobjects where
name=约束名)
alter table 表名 drop constraint
约束名;
go
–给钦赐列加多暗中认可约束
alter table 表名 add constraint 约束名
default(约束值) for 列名;
go

示例:

use [testss]
go
–剖断默许约束是还是不是存在,假使存在则先删除,如若不真实则一贯抬高
if exists(select * from sysobjects where
name=’defalut_height’)
alter table [testss].[dbo].[test1]
drop constraint defalut_height;
go
–给钦定列增多暗中认可约束
alter table [testss].[dbo].[test1]
add constraint defalut_height default(160) for height;
go

图片 13

图片 14

在新表中创设外键

 语法:

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

图片 15

创立表时充裕私下认可限定

第生机勃勃判定表是或不是选在,假如存在则先删除表再增加,假若不设有则一直抬高。

语法:

–成立新表时增加暗中认可限定
–数据库声明
use 数据库名
go
–借使表已存在则先删除表再次创下造,要是表不设有则一直开立
if exists(select * from sysobjects where
name=表名 and type =’U’)
drop table 表名;
go
–建表语法注脚
create table 表名
(
–字段评释
列名 列类型 identity(1,1) not
null,
列名 列类型) null,
列名 列类型 null,
列名 列类型 null,
列名 列类型,
列名 列类型 constraint 约束名 default
默认值,
primary key clustered(列名 asc)
with(ignore_dup_key=off) on [primary] –主键索引申明
)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’列名’;

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’列名’;

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

示例:

–创制新表时增添暗中认可节制
–数据库注脚
use testss
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,
height int constraint default_he default
166,
primary key clustered(id asc)
with(ignore_dup_key=off) on [primary] –主键索引证明
)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

图片 17

FOREIGN KEY约束优劣点

优点:

1、保障数据的后生可畏致性,完整性,更牢靠。

2、关联合检查询时,能够用到FK 的总结音信。

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

缺点:

1、删队或更新关联数据时索要做检讨,成效会异常的低。

2、手工资调节数据时,会存在主从表校验,会比较劳苦。

3、批量导入数据时,会设有外键校验,必要先关闭外键约束,导入完成再展开外键约束,操作比较费心。

 

DEFAULT约束优劣势

优点:

1、使用暗许值能够减掉代码量,新扩张加少时能够不用写新添暗中同意值列,履行新添操作时时私下认可填充。

2、较有助于开展总括和深入分析,甚至福利程序逻辑操作。

缺点:

1、使用不为NULL的私下认可值,占用了越来越多的存放空间。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注