SQLServer之DEFAULT约束

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。

  外键和主键区别,每个表中的外键数目不限量独一性。在每种表中,每一有-~2五13个外键。独一的限制是一个列只好援用一个外键。叁个列能够被四个外键援用。

  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。后五个是在SQLServer二〇〇七中引入的,固然要合营到SQLServer3000的话,要幸免选取这七个级联合浮动作。然则她们的才做是特别轻巧的:假诺推行更新而改换了四个父行的值,那么子行的值将被设置为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

  上边给出的列表只是一小部分,而规范实际上市Infiniti多的。大致全部能够放置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的选项来运维ALTEENVISION语句,那样就能够裁撤需求的自律。

  先来拜谒上节中成立的那几个约束:

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地图