SQLServer之CHECK约束

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

CHECK约束添加规则

1、CHECK
约束用于限制列中的值的限量。

2、Check约束通过逻辑表明式来判断数据的有效,用来限制输入一列或多列的值的限量,在列中立异数据时,所要输入的始末必须满意Check约束的尺度,否则将不能正确输入。

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

4、如若对一个表定义 CHECK
约束,那么此约束会在一定的列中对值举行限定。

一、约束的归类

  在SQLServer中,有3种不同品种的束缚。

  1、实体约束

    实体约束是有关行的,比如某一行出现的值就不允许现身在此外行,例如主键。

  2、域约束

    域约束是关于列的,对于持有行,某一列有这些约束,例如CHECK约束。

  3、参照完整性约束

    倘使某列的值必须与其他列的值分外,这就表示需要一个参考完整性约束,例如外键。

动用SSMS数据库管理工具添加CHECK约束

1、连接数据库,接纳数据库,采取数据表-》右键点击(或者间接点击约束,右键点击,拔取丰硕约束,后边步骤一样)-》拔取设计。

图片 1

2、接纳要增长约束的数据列-》右键点击-》选用CHECK约束。

图片 2

3、在CHECK约束弹出框中点击添加。

图片 3

4、在CHECK约束弹出框中-》输入CHECK约束表明式-》输入CHECK约束名-》输入CHECK约束描述-》其他可以挑选默认。

图片 4

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

图片 5

二、约束命名

  在求学约束从前,首先来了然下为约束命名需要专注哪些地点。

  SQLServer在大家不提供名称时,会活动成立名称,可是由系统自动创设的称谓并不是专门有用。

  例如,系统生成的主键名称或者是这么的:PK_Employees_145C0A3F。 

  PK代表主键(primary
key),Employees代表在Employees表中,而余下的“145C0A3F”部分是为着保险唯一性而随便生成的值。唯有经过脚本创建才会取得这种值,如若是通过Managerment
Studio创设表,那么就直接是PK_Employees。

  对于系统自动生成的Check约束名称如:CK_Customers_22AA2996。CK代表这是一个Check约束,Customers代表是在Customers表中,后边的22AA2996依旧一个随机数。假使一个表中有五个Check约束,则命名可能如下:

  CK_Customers_22AA2996

  CK_Customers_25869641

  CK_Customers_267ABA7A

  假若您需要修改这些约束其中的一个,那么您很难分辨那一个约束到底是哪一个。

  由此,为了可以一眼看上去就通晓这几个约束是用来干什么的,我们应有运用一种简单明了的短语来举办命名。

  例如要保证某一列电话号码格式正确的自律,大家可以动用命名CK_Customers_PhoneNo这样的短语来定名。

  显而易见命名要到位以下几点:

  1、一致性

  2、通俗易懂

  3、满足上述多少个标准化的景观下简化名称。

行使T-SQL脚本添加CHECK约束

三、键约束

当表结构存在时

添加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

alter table test1 add constraint check1
check(height>=170 and height<=175);
go

 图片 6

图片 7

1、主键约束

   主键是每行的唯一标识符,仅仅通过它就能精确定位到一行,其中主键列在漫天表中不可能有再次,必须含有唯一的值(不可以为NULL)。由于主键在关周详据库中的紧要性,由此它是所有键和封锁中最要害的。

   下边的话说主键的创设情势

  1、在创建表的时候创设主键约束。

create table customer
(
    customerId        int identity    not null
        primary key,  --创建主键约束
    CustomerName    nvarchar(30)    not null
);

  咋样,非常简单吧!

  2、在已存在的表上创制主键约束

  现在尽管已经存在了一张表,但是还尚未主键约束:

alter table person
    add constraint PK_Employee_Id  --外键名称
    primary key(personId)  --personId 字段名

  alter名称告诉SQLServer如下音讯:

  1、添加了部分情节到表中(也可以去除表中的少数内容)

  2、添加了怎么内容(一个羁绊)

  3、对约束的命名(允许将来直接访问约束)

  4、约束的连串(主键约束)

  5、约束应用于哪个列。

  3、复合主键的创办

  假诺实在Management
Studio中,创设复合主键,只需要按住Ctrl键,选中四个列,然后设置为主键就OK了,分外简单。上边重要描述使用T-SQL成立复合主键的形式:

ALTER TABLE 表名 WITH NOCHECK ADD 
CONSTRAINT [PK_表名] PRIMARY KEY NONCLUSTERED 
( 
[字段名1], 
[字段名2] 
) 

  在多对多关系中,平常会有一张表来描述其他两张表的涉及,就以此读者和书为例子:

图片 8

ALTER TABLE ReaderAndBook 
ADD 
CONSTRAINT [PK_ReaderAndBook] PRIMARY KEY NONCLUSTERED 
( 
ReaderId, 
BookId 
) 

图片 9

当表结构不存在时

比方表结构不存在,可以间接抬高约束,可以同时加上一个仍旧六个约束。

语法:

–若是表结构不设有时添加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

 图片 10

图片 11

图片 12

2、外键约束

  外键既能确保数据完整性,也能展现表之间的涉及。添加了外键之后,插入引用表的笔录要么必须被引用表中被引用列的某条记下匹配,要么外键列的值必须设置为NULL。

  外键和主键不平等,每个表中的外键数目不限量唯一性。在每个表中,每一有-~253个外键。唯一的界定是一个列只可以引用一个外键。一个列可以被五个外键引用。

  1、创设表的时候创设外键

图片 13

create table orders
(
    orderId        int identity    not null
        primary key,
    customerId    int                not null
        foreign key references customer(customerId)  --约束类型-外键-引用表(列名)
);

图片 14

  2、在已存在的表中添加一个外键

  假诺下面的代码去掉了增长外键行,那么可以书写代码如下:

alter table orders
    add constraint FK_Orders_CustomerId        --添加约束 名称
        foreign key (customerId)    references customer(customerId)    --外键约束,外键列名,被引用列名

  刚添加的自律和前边增长的自律一样生效,如果某行引用customerId不存在,那么就不容许把该行添加到Orders表中。

  3、级联动作

  外键和其它类型键的一个第一区别是:外键是双向的,即不仅是限量子表的值必须存在于父表中,还在每趟对父表操作后检查子行(这样避免了孤行)。SQLServer的默认行为是在子行存在时“限制”父行被去除。不过,有时会自动删除任何借助的笔录,而不是预防删除被引用的记录。同样在立异记录时,可能希望依靠的记录自动引用刚刚更新的记录。相比较少见的图景是,你恐怕希望将引用行改变为某个已知的情状。为此,可以挑选将借助行的值设置为NULL或者特别列的默认值。

  这种举办机动删除和自动更新的长河称为级联。这种经过,特别是删除过程,可以透过几层的来说关系(一条记下依赖于另一条记下,而这另一条记下又凭借其他记录)。在SQLServer中贯彻级联动作需要做的就是修改外键语法-只需要在增长前方加上ON子句。例如:

alter table orders
    add constraint FK_Orders_CustomerId        --添加约束 名称
        foreign key (customerId)    references customer(customerId)    --外键约束,外键列名,被引用列名
        on update     no action    --默认  修改时不级联更新子表
        on delete     cascade      --删除时级联删除依赖行

  当在拓展级联删除时,假若一个表级联了另一个表,而另一个表又级联了任何表,这种级联会一向下去,不受限制,那其实是级联的一个饮鸩止渴之处,很容易一个不小心删掉大量数码。

  级联动作除了no action,cascade之外,还有set null和set
default。后六个是在SQLServer2005中引入的,倘诺要配合到SQLServer2000的话,要避免使用这五个级联动作。不过他们的才做是非常简单的:假使推行更新而更改了一个父行的值,那么子行的值将被安装为NULL,或者安装为该列的默认值(不管SET
NULL仍旧SET DEFAULT)。

  4、外键其他地点的考虑

    外键中的之只有入选可能的取舍:

    1、在列中填充与被引述表中的相应列相匹配的值。

      通过定义引用列为NOT
NULL,可以使外键完全是必须的(即用户增长数据时务必引用表中必须有相匹配的一行数据)。

    2、不填充任何值,而使该值为NULL。

      允许引用列有NULL值时,用户可以采用不提供值-即使在被引用表没有与NULL值匹配的行,依然允许插入。

CHECK约束优缺点

优点:

1、保证列数据标准和限量,可以约束数据完整性

2、有Check约束的列能够提供给查询优化器信息之所以提高性能

缺点:

1、插入或者修改时数据不适合约束规则,无法修改成功。

3、唯一约束

  唯一约束与主键相比较相似,共同点在于它们都务求表中指定的列(或者列的重组)上有一个唯一值,区别是唯一约束尚未被看作表中著录的绝无仅有标识符(尽管你可以按这样的不二法门使用也实惠),而且可以有多少个唯一约束(而在各种表中只可以有一个主键)。

  一旦成立了唯一约束,那么指定列中的每个值必须是绝无仅有的。如若更新或者插入一条记下在带唯一约束的列上有一度存在的值的笔录,SQLServer将抛出错误,拒绝这么些记录。

  和主键不同,唯一约束不会自行制止设置一个NULL值,是否同意为NULL由表中相应列的NULL选项的安装决定,但虽然真的允许NULL值,一张表中也只可以够插入一个NULL值(假诺同意多少个,这就不叫唯一了)。

  在已存在的表上成立唯一约束:

alter table Account
    add constraint AK_AccountName    --约束名
    unique (Account_Name)    -- 列名

  AK代表替换键(Alternate Key),唯一约束也叫替换键。

  主键和唯一约束的区分:

  •    
    主键约束不允许出现NULL值。任何索引的索引键都不容许包含null值。但唯一约束允许包含NULL值,但唯一约束把三个NULL值当作重复值,所以施加了唯一约束的每一列只同意包含一个NULL值。
  •    
    成立主键时会自动创造聚集索引,除非当前表中早就包含了聚集索引或是创设主键时指定了NONCLUSTERED关键字。
  •    
    创制唯一约束时会自动创造非聚集索引,除非你指定了CLUSTERED关键字并且当前表中还一向不聚集索引。
  •     每个表中只好有一个主键,但可以由三个唯一约束。

4、CHECK约束  

  CHECK约束约束可以和一个列关联,也得以和一个表关联,因为它们得以检查一个列的值绝对于此外一个列的值,只要这多少个列都在同一个表中以及值是在立异或者插入的同样行中。CHECK约束仍可以用于检查列值组合是否满意某一个正式。

  可以像使用where子句一样的规则来定义CHECK约束。CHECK约束规范的言传身教如下:

目标 SQL
限制Month列为合适的数字 BETWEEN 1 AND 12
正确的SSN格式 LIKE'[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]’
限制为一个快递公司的特定列表 IN(‘UPS’,’Fed Ex’,EMS’)
价格必须为正数 UnitPrice >= 0
引用同一行中的另外一列 ShipDate >= OrderDate

  下面给出的列表只是一小部分,而标准实际上市无限多的。几乎所有可以放手where子句的尺度都可以放置该约束中。而且和任何选项(规则和触发器)相比较,CHECK约束执行进度更快。

  在已存在的表中添加一个CHECK约束:

alter table Account
    add constraint CN_AccountAge
    check 
    (Account_Age > 18);    -- 插入年龄必须大于18

  假如此时视图添加一条不满足的笔录,将报如下错误:

  insert into Account values (22,'洪',17)

消息 547,级别 16,状态 0,第 1 行
INSERT 语句与 CHECK 约束"CN_AccountAge"冲突。该冲突发生于数据库"Nx",表"dbo.Account", column 'Account_Age'。
语句已终止。

5、DEFAULT约束

  和具有约束一样,DEFAULT约束也是表定义的一个组成部分,它定义了当插入的新行对于定义了默认约束的列未提供对应数据时该咋办。可以定义它为一个字面值(例如,设置默认薪水为0,或者安装字符串列为”UNKNOWN”),或者某个系统值(getdate())。

  对于DEFAULT约束,要打听以下多少个特性:

  1、默认值只在insert语句中使用-在update语句和delete语句中被忽略。

  2、假设在insert语句中提供了任意值,这就不使用默认值。

  3、假设没有提供值,那么总是利用默认值。

  值得注意的是,update命令的平整由一个不等,假诺显示表达使用默认值就是不同。可以透过利用首要字DEFAULT表示更新的值设置为默认值。

  5.1在开创表时概念DEFAULT约束:

图片 15

create table person
(
    person_id int identity not null
        primary key,
    person_name nvarchar(30) not null
        default '无名氏',
    person_age int not null
)

图片 16

  在实施语句后:

insert into person (person_age) values(24)

  表中被插入一条记下如下:

  图片 17

   5.2在已存在的表上添加DEFAULT约束:

alter table person
    add constraint CN_DefaultName
    default    '无名氏' for person_name

6、禁用约束

   有时我们想临时或永久地消除约束。不过SQL
Server并没有提供删除约束的办法。SQL
Server只同意禁用外键约束或CHECK约束,而还要保持约束的完整性。

   禁用一个数据完整性规则平时是因为早已有不行数据了。这样的数码一般分为以下两类:

  1、在开立约束时早已在数据库中的数据

  2、在约束创制将来希望充分的数量

  SQL
Server允许禁用完整性检查一段时间来对两样的不算数据作处理,然后再另行启用完整性(不是大体删除数据完整性约束)。

    专注:不可能禁用主键约束依然唯一约束

  6.1、在成立约束时,忽略检查此前的不满足数据

  要添加一个约束,可是有不行使到已存在的多寡中,可以再执行Alter
Table语句添加约束时选拔WITH NOCHECK选项。

  依照地方创建Check约束的措施,已经Alter
Table时,表中我已经存在不相符的多少,那么Alter Table操作将被SQL
Server拒绝执行。除非已经存在的拥有数据都满足CHECK约束的准绳,否则SQL
Server不会执行创制约束的下令。要缓解这多少个问题,我们得以添加WITH NOCHECK。

  我们先新建一个表只有3个字段的表,Id、姓名、年龄,并在里面插入一条不满足要求的数据:

insert into Account values (23,'洪',17)

   然后举行添加封锁命令:

alter table Account
    add constraint CN_AccountAge18
    check 
    (Account_Age > 18);    -- 插入年龄必须大于18

   SQL Server报一下破绽百出:

消息 547,级别 16,状态 0,第 1 行
ALTER TABLE 语句与 CHECK 约束"CN_AccountAge18"冲突。该冲突发生于数据库"Nx",表"dbo.Account", column 'Account_Age'。

   这时候我们换一种办法去执行:

alter table Account
    WITH NOCHECK
    add constraint CN_AccountAge18
    check 
    (Account_Age > 18);    -- 插入年龄必须大于18

   以上代码就可知得逞实施,并且只有将来添加的数量有所约束,在此之前增长的不符合条件的数目记录仍旧存在。

   6.2暂时禁用已存在的束缚

   当我们需要从另一数据库中导入数据到表中,而表中已创建了束缚的时候,可能会存在一些数码和规则不包容。当然有一个解决模式是先删除约束,添加需要的多寡,然后WITH
NOCHECK在添加再次回到。然而如此做太难为了。我们不需要这样做。大家能够利用名为NOCHECK的选项来运行ALTER语句,这样就可知撤除需要的羁绊。

  先来探视上节中开创的这个约束:

alter table Account
    add constraint CN_AccountAge18
    check 
    (Account_Age > 18);    -- 插入年龄必须大于18

   要废除上述约束可以那样来:

Alter Table Account
    NOCHECK
    constraint CN_AccountAge18

  执行命令:

  insert into Account values (25,'取消了约束',17)

  执行成功,成功添加了一条龙数据。

  留意到又可以向表中插入格式不匹配的多寡了。

  这里要表达下,如下知道一个约束是否是启用仍旧禁用呢?sp_helpconstraint命令,当我们执行sp_helpconstraint的时候,会有一列status_enabled展现该约束的启用情状:

  sp_helpconstraint Account

  图片 18

   留意到status_enabled名列Disabled表明是禁用的意趣。

  当要启用约束时,只需要用将语句中的NO CHECK替换为CHECK就可以了:

Alter Table Account
    CHECK
    constraint CN_AccountAge18

   执行之后,约束又启用了:再来sp_helpconstraint看下:

  图片 19

   留意到status_enabled列变成了Enabled。

  status_enabled的三种情状如下:

  Enabled:启用;

  Disabled:禁用;

7、规则和默认值

  规则和默认值的施用要早于CHECK和DEFAULT约束。他们是较老的SQL
Server备用约束的一有些,当然也不是尚未亮点。自7.0版本之后,MicroSoft列出规则和默认值只是为了向后优良,而不准备在今后继续帮助那个特点。由此对此生成新代码时,应该利用约束。

  规则、默认值与约束的本质区别是:约束是一个表的特性,本身没有存在格局,而平整和默认值是表和本身的骨子里目标,本身存在。约束是在表定义中定义的,而平整和默认值是单独定义,然后”绑定到”表上。

  规则和默认值的独立对象特性使得它们可以在录取时绝不再行定义。实际上,规则和默认值不限于被绑定到表上,它们也可以绑定到数据类型上。

  7.1规则

   规则和CHECK约束非凡相似。它们中间的唯一区别是平整每一遍只好成效于一个列。可以将一律规则分别绑定到一个表中的三个列,但是规则分别功用于每个列,根本不会发现到其他列的存在。像QtyShipped

<=
QtyOrdered这样的自律不适用于规则(它引用六个列),而LIKE([0-9][0-9][0-9])这样的概念适用于规则。

  概念规则:

  上边定义一个平整,这样就可以率先看到有别于所在:

CREATE RULE Age18Rule
    AS @Age > 18  

  那里相比的是一个变量,不管被检查的列是何等值,这多少个值将用于替换@Age。因而在这些示例中,规则所绑定的任何列的值都不可以不高于18。

  到近日截止,只是创制了一个规则,但以此规则还没对任何表的其它列起效率,要激活那一个规则需要拔取一个囤积过程:sp_bindrule。

  将规则Age18绑定到表person的person_age列:

  EXEC sp_bindrule 'Age18Rule','person.person_age';

  此时,假使我们实施不满意规则的插入操作:

insert into person values ('绑定规则',17)

   将回到如下报错音讯:

消息 513,级别 16,状态 0,第 1 行
列的插入或更新与先前的 CREATE RULE 语句所指定的规则发生冲突。该语句已终止。冲突发生于数据库 'Nx',表 'dbo.person',列 'person_age'。
语句已终止。

  很明朗,规则已经生效。

  要特别注意的是,在绑定在此之前,规则与其他表,任何列都没有涉及,因而在绑定的时候,第二个参数要加.指定表名与列名(tablename.column)。

  扫除绑定规则:

  当大家需要在一个列上解除绑定规则的时候,只要举行sp_unbindrule

  删除刚才绑定的条条框框:

EXEC sp_unbindrule 'person.person_age';

  这时候,执行方才的插入操作,就不会报错了。

  剔除规则:

  假诺期待将规则从数据库中到底去除,那么可以在表中动用相当了解的DROP语法。

DROP RULE <rule name>

  如剔除刚才创设的这条规则:

DROP RULE Age18Rule

  7.2默认值

  默认值类似于DEFAULT。实际上默认值-DEFAULT约束的涉及与规则-CHECK约束的涉及大多。区别在于它们被追加到表中的方法和对用户自定义数据类型的默认值(是目的,而不是束缚)支持。

  定义默认值的语法和概念规则类似:

  CREATE DEFAULT <default_name>
  AS <default value>

  开创默认值:

  因而,假使要为Age定义一个值为0的默认值:

CREATE DEFAULT AgeDefault
AS 0

  绑定默认值:

  同样,即使不绑定到一个目的上,则默认值是不起效用的。要绑定的话,使用存储过程sp_bindefault。

  EXEC sp_bindefault 'AgeDefault','person.person_age';

  要从表中解决默认值的绑定,使用sp_unbindefault:

  sp_unbindefault 'person.person_age';

  删除默认值:

  假若要从数据库中到底去除一个默认值,则可以动用DROP语法,与删除规则一样:

  DROP DEFAULT AgeDefault

  7.3规定哪些表和数据类型使用给定的条条框框或默认值

  如若期待删除或者涂改规则或默认值。那么你可以先看看怎么着表和数据类型在行使它们。SQL
Server如故利用系统存储过程解决这个问题。这多少个蕴藏过程是sp_depends。其语法如下所示:

  EXEC sp_depends <object name>

  sp_depends提供了借助于你所查询对象的具备目的列表。

8、触发器

  触发器也能够用于落实数据完整性,这些情节比较多,新建一篇小说叙述。

9、咋样抉择

  经过上述的上学,对于数据完整性,你会意识有很多种足以选用,那么什么样挑选合适的牢笼呢?

限制 优点 缺点
约束

快速

可以引用其他列

在命令执行前发生

遵循ANSI标准

必须对每个表重新定义

不能引用其他表

不能绑定到数据类型

规则

独立的对象

可重用

可以绑定到数据类型

命令执行前发生

稍慢

不能跨列使用

不能引用其他表

实际上只用于向后兼容

默认值

非常灵活

可以引用其他列或其他表

可以通过.NET引用SQL Server之外的其他信息

在命令执行之后发生

系统开销很大

  假诺要贯彻更强健的逻辑模型以及宽广应用用户自定义数据类型,则相似接纳规则和默认值。在这种意况下规则和默认值可以提供成千上万效用,容易管理,而不用太多的编程开销。

  只有在无法选取约束时利用触发器。和自律一样,他们被增大到表中,而且必须对创造的各类表重新定义。好的地点是触发器几乎可以做数据完整性方面的其他操作。实际上再没有出现外键时,他们常被看成外键的替代品。

  而在任何情状下,应将约束作为数据完整性解决方案的抉择。它们执行进度快,而且容易创制。他们的老毛病是功用有限(除了外键约束,都不可能引用其他表),而且对于通用约束逻辑来说,需要几遍次地再度定义。

留下评论

网站地图xml地图