SQLServer之DEFAULT约束

发布时间:2019-01-01  栏目:MySQL  评论:0 Comments

DEFAULT约束添加规则

1、若在表中定义了默认值约束,用户在插入新的数码行时,如若该行没有点名数量,那么系统将默认值赋给该列,假若我们不安装默认值,系统默认为NULL。

2、如若“默认值”字段中的项替换绑定的默认值(以不带圆括号的花样体现),则将唤起您消除对默认值的绑定,并将其替换为新的默认值。

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

4、若要输入数值默认值,请输入数值并且不要用引号将值括起来。

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

一、约束的分类

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

  1、实体约束

    实体约束是关于行的,比如某一行出现的值就不同意出现在其他行,例如主键。

  2、域约束

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

  3、参照完整性约束

    假若某列的值必须与任何列的值非凡,这就表示需要一个参照完整性约束,例如外键。

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

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

图片 1

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

图片 2

3、点击保存按钮(或者ctrl+s)-》刷新表-》再度打开表查看结果。

图片 3

二、约束命名

  在读书约束以前,首先来了然下为束缚命名需要留意哪些地点。

  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脚本添加DEFAULT约束

三、键约束

当表结构已存在时

先是判断表中是否存在默认约束,倘若存在则先删除默认约束再添加,假使不存在则一贯抬高。

语法:

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

图片 4

图片 5

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] 
) 

  在多对多交换中,平日会有一张表来描述其他两张表的关联,就以此读者和书为例子:

图片 6

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

图片 7

开创表时添加默认约束

率先判断表是否选在,假诺存在则先删除表再添加,如果不存在则平素抬高。

语法:

–创制新表时添加默认约束
–数据库讲明
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

图片 8

图片 9

2、外键约束

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

  外键和主键不一致,每个表中的外键数目不限定唯一性。在各种表中,每一有-~253个外键。唯一的范围是一个列只可以引用一个外键。一个列可以被三个外键引用。

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

图片 10

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

图片 11

  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值匹配的行,依然同意插入。

DEFAULT约束优缺点

优点:

1、使用默认值可以减去代码量,新增多少时可以不用写新增默认值列,执行新增操作时时默认填充。

2、较便宜开展总结和剖析,以及便于程序逻辑操作。

缺点:

1、使用不为NULL的默认值,占用了更多的蕴藏空间。

 

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约束:

图片 12

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

图片 13

  在举办语句后:

insert into person (person_age) values(24)

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

  图片 14

   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

  图片 15

   留意到status_enabled名列Disabled表达是禁用的情致。

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

Alter Table Account
    CHECK
    constraint CN_AccountAge18

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

  图片 16

   留意到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地图