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
约束的其实多少依旧受硬件配备甚至数据库和应用程序设计的界定。 表最多能够将 252个别的表和列作为外键援引(传出援引卡塔 尔(阿拉伯语:قطر‎。 SQL
Server 二零一五 (13.x) 将可在独立的表中引用的其余表和列(传入援用卡塔 尔(阿拉伯语:قطر‎的多少节制从
253 提升至 10,000。 (宽容性品级起码必得为
130。卡塔尔数量约束的滋长带来了下列限制:

DELETE 和 UPDATE
DML 操作帮助胜出 253 个外键征引。 不帮助ME索罗德GE 操作。

对本身进行外键援用的表仍只可以进展 255个外键援用。

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

8、对于有时表不强制 FOREIGN KEY 限定。

9、如果在 CLRubicon客商定义类型的列上定义外键,则该项指标贯彻必须支持二进制排序。

10、仅当 FOREIGN
KEY
节制引用的主键也定义为品种 varchar(max) 时,本领在这里约束中利用场目为varchar(max) 的列。

DEFAULT约束增加法规

1、若在表中定义了暗中同意值约束,客商在插入新的数额行时,假设该行未有一些名数量,那么系统将默许值赋给该列,假若大家不设置默许值,系统默以为NULL。

2、若是“默许值”字段中的项替换绑定的暗中同意值(以不带圆括号的情势显得卡塔尔国,则将唤起您拨冗对默许值的绑定,并将其替换为新的暗中认可值。

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

4、若要输入数值暗许值,请输入数值何况毫不用引号将值括起来。

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

CHECK约束增添准绳

1、CHECK
约束用于限定列中的值的界定。

2、Check限定通过逻辑表明式来决断数据的卓有效率,用来节制输入一列或多列的值的节制,在列中立异数据时,所要输入的内容必得满意Check节制的规格,不然将不恐怕正确输入。

3、假如对单个列定义 CHECK
限定,那么该列只允许特定的值。

4、倘使对八个表定义 CHECK
约束,那么此约束会在特定的列中对值实行界定。

行使SSMS数据库管理工科具增加外键约束

本示例演示当表结构已存在时增加外键限制,创设表时加上国审计大学键约束步骤和表结构存在时增多外键步骤相像。示例演示如下:

1、连接数据库,张开要加多外键的数目表-》右键点击-》接收设计。

home88一必发 1

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

home88一必发 2

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

home88一必发 3

4、加多完成后-》首先修改表和列标准。

home88一必发 4

5、在表和列窗口中-》输入外键名-》在左侧选择主表和事关的列-》在左侧接收从表和作为外键的列-》点击分明。

home88一必发 5

6、在外键关系窗口中-》可接收充足只怕不增添外键描述-》可筛选足够只怕不增加改进可能去除数据时级联操作-》可接收丰裕只怕不添坚实制外键节制-》可筛选丰盛或许不添狠抓制用于复制-》点击关闭。

home88一必发 6

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

home88一必发 7

home88一必发 8

利用SSMS数据库管理工科具加多DEFAULT约束

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

home88一必发 9

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

home88一必发 10

3、点击保存按键(大概ctrl+s)-》刷新表-》再度展开表查看结果。

home88一必发 11

利用SSMS数据库管理工科具增添CHECK约束

1、连接数据库,接受数据库,接纳数据表-》右键点击(或然直接点击限定,右键点击,选择丰裕节制,前面步骤类似)-》选用设计。

home88一必发 12

2、选取要加多限定的多寡列-》右键点击-》接纳CHECK约束。

home88一必发 13

3、在CHECK限制弹出框中式点心击增添。

home88一必发 14

4、在CHECK限制弹出框中-》输入CHECK限制表达式-》输入CHECK限定名-》输入CHECK限定描述-》别的还不错暗中认可。

home88一必发 15

5、点击关闭-》点击保存按键(也许ctrl+s)-》刷新表查看结果。

home88一必发 16

利用T-SQL脚本加多外键限制

行使T-SQL脚本增多DEFAULT约束

选拔T-SQL脚本增加CHECK约束

当表结构已存在时

比方要增加度约束的表已存在外键节制,须求先删除此之外键约束再增添外键约束。假若空中楼阁外键节制能够增加外键限定。

语法:

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

home88一必发 17

当表结构已存在时

率先推断表中是不是留存默许约束,若是存在则先删除暗中同意节制再加多,假设不设有则一贯抬高。

语法:

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

home88一必发 18

home88一必发 19

当表结构存在时

加多CHECK约束时首先校验约束是还是不是已存在,要是存在应该是先删除再增添,若是不设有则一直抬高。

语法:

— 增添三个暗中认可约束
use 数据库名;
go

if exists(select * from sysobjects where
name=约束名)
alter table 表名 drop constraint
约束名;
go

alter table 表名 add constraint 节制名
check(限定准则),constraint 约束名 check(限制法则);
go

示例:

— 增添几个私下认可限定
use testss;
go

if exists(select * from sysobjects where
name=’check1′)
alter table test1 drop constraint
check1;
go

home88一必发,alter table test1 add constraint check1
check(height>=170 and height<=175);
go

 home88一必发 20

home88一必发 21

在新表中开创外键

 语法:

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

home88一必发 22

创建表时拉长私下认可约束

先是剖断表是否选在,假若存在则先删除表再加多,要是官样文章则直接助长。

语法:

–创设新表时增多暗中认可约束
–数据库注明
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

home88一必发 23

home88一必发 24

当表结构不真实时

即使表结构不设有,能够一直抬高度大限定,能够同有的时候候丰裕二个大概多少个节制。

语法:

–假如表结构不设有时增多check约束
use 数据库名;
go
–要是已存在表则删除
if exists(select * from sysobjects where
name=表名 and xtype=’U’)
drop table 表名;
go
–创建表
create table 表名
(
–字段证明
列名 int identity(1,1) not null,
列名 nvarchar(50) null,
列名 nvarchar(50) null constraint 约束名
check(节制法则),
列名 nvarchar(50) null,
列名 int,
列名 int constraint 节制名
check(限定法则)
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

示例:

–借使表结构一纸空文时增多check节制
use testss;
go
–假如已存在表则删除
if exists(select * from sysobjects where
name=’test1′ and xtype=’U’)
drop table test1;
go
–创建表
create table test1
(
–字段注脚
id int identity(1,1) not null,
name nvarchar(50) null,
sex nvarchar(50) null constraint check1
check(sex=’男’ or sex=’女’),
age nvarchar(50) null,
classid int,
height int constraint check2
check(height>=110 and height<=120)
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

 home88一必发 25

home88一必发 26

home88一必发 27

FOREIGN KEY约束优短处

优点:

1、保障数据的风流倜傥致性,完整性,更可相信。

2、关联查询时,能够用到FK 的总计消息。

3、有主外键的数据库设计能够追加EEvoque图的可读性。

缺点:

1、删队或更新关联数据时索要做检查,功用会十分的低。

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

3、批量导入数据时,会存在外键校验,须要先关闭外键节制,导入实现再张开外键限定,操作相比麻烦。

 

DEFAULT节制优劣点

优点:

1、使用默许值能够减掉代码量,新添多少时能够不用写新扩张暗中同意值列,执行新添操作时时暗许填充。

2、较平价开展总括和剖判,以致便于程序逻辑操作。

缺点:

1、使用不为NULL的暗中同意值,占用了越多的囤积空间。

 

CHECK节制优劣点

优点:

1、保障列数据标准和界定,能够节制数据完整性

2、有Check约束的列能够提须求查询优化器新闻之所以进级质量

缺点:

1、插入也许校正时数据不符合约束法则,不可能修正成功。

相关文章