1010cc时时彩标准版 > 1010cc三分网站 > 的封锁标准,二零一零从入门到明白

原标题:的封锁标准,二零一零从入门到明白

浏览次数:84 时间:2019-11-17

自定义法规维护数据完整性

平整是对列或自定义数据类型的值的规定和范围。自定义准则的表达式必供给赶回布尔类型的值,并且表达式中不能够满含多少个变量。

CREATE RULE score_rule AS @math_score>=0;
GO--新建规则score_rule,参数@math_score
EXEC sp_addtype 'score_type','float','NULL';
GO--新建自定义数据类型score_type
CREATE TABLE table_score(--新建表table_score,预设mt_score和at_score字段用于绑定规则
s_id VARCHAR(4),
s_name VARCHAR(10),
mt_score float,--该字段将用于规则score_rule绑定到列
at_score score_type--该字段将用于规则score_rule绑定到自定义数据类型
);
GO
EXEC sp_bindrule 'score_rule','score_type';
GO--将score_rule规则绑定到自定义数据类型score_type
EXEC sp_bindrule 'score_rule','table_score.mt_score';
GO--将score_rule规则绑定到table_score表的mt_score列

----以下进行规则测试
INSERT INTO table_score(
s_id,
s_name,
mt_score,
at_score
)VALUES(
'0001',
'张华',
'-1',
'-1'
);
GO

开展违反法规的插入后,数据库报错
消息513,级别16,状态0,第1 行
列的插入或更新与原先的CREATE RULE 语句所钦点的平整发生冲突。该语句已截至。冲突时有发生于数据库'test',表'dbo.table_score',列'mt_score'。
言语已告风流浪漫段落。
很明显,mt_score的插入值为-1,违反了亟须高于等于0的规规矩矩,数据库报错。将mt_score的插入值改成切合准绳的多寡,再度运营插入语句,数据库依然会报错,因为at_score字段的插入值也是反其道而行之法则的。将三个数据改成切合准绳的归来,推行成功。

注:新建准则时表明式必定固然回来布尔类型的值,不然会报错

消息4145,级别15,状态1,过程sum_score,第1 行
在应利用原则的上下文(在';' 周围)中钦点了非布尔类型的表明式。

AS

即便准则与绑定的列不相配,SQL Server即将插入值时回来错误音信。

SQLServer - 约束

自定义暗中认可值对象保障数据完整性

CREATE DEFAULT date_today AS GETDATE();
--新建默认值对象名date_today,默认值为getdate()函数,获取当前日期
GO
EXEC sp_addtype date_time,'date','NULL';
--利用存储过程新建自定义数据类型date_time,参照系统数据类型date
GO
EXEC sp_bindefault 'date_today','date_time';
--将默认值对象date_today绑定到自定义数据类型date_time上
GO
CREATE TABLE table3(--新建table3,设置字段t3_date的数据类型为date_time
    t3_id VARCHAR(12),
    t3_name VARCHAR(20),
    t3_class VARCHAR(12),
    t3_type VARCHAR(12),
    t3_date date_time
);
GO
INSERT INTO table3(--为新建表table3插入一条数据,不指定t3_date的值,看默认值是否有效
    t3_id,
    t3_name,
    t3_class,
    t3_type
)VALUES(
'2018038220',
'李建',
'社会与科学',
'类型1'
);
GO
SELECT * FROM table3;--查询table3数据,看t3_date是否有默认值为当前日期

查询结果如下
图片 1

ALTER TABLE table3
ADD t3_date1 DATE;--在table3表中新增一列t3_date1,数据类型为DATE
GO
EXEC sp_bindefault 'date_today','table3.t3_date1';
--直接将默认值对象date_today绑定到table3的t3_date1列
GO
INSERT INTO table3(--为新建表table3插入一条数据,不指定t3_date和t3_date1的值,看默认值是否有效
    t3_id,
    t3_name,
    t3_class,
    t3_type
)VALUES(
'2018038221',
'李建',
'社会与科学',
'类型'
);
GO
SELECT * FROM table3;
GO

查询结果如下
图片 2

       EXAMPLE

 

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提供了依附于您所查询对象的持有目的列表。

增进封锁不点名限定名
ALTER TABLE table3
ADD DEFAULT '类型2' FOR t3_type;
GO

    ->实体完整性(Entity Integrity) :现实世界的实业是可分别的,即它们具有某种唯少年老成性标志。相应地,关系模型中主键应作为唯风姿浪漫性标记。由此实体完整性准则规定基本关系的持有主键(Primary Key)都不能够取空值(NULL) 。

③UNIQUE约束 

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

  在多对多联系中,平时会有一张表来描述其余两张表的涉嫌,就以此读者和书为例子:

图片 3;)

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

图片 4;)

建表时设置NOT NULL限制
CREATE TABLE table3(
    t3_id VARCHAR(12) NOT NULL,
    t3_name VARCHAR(20) NOT NULL,
    t3_class VARCHAR(12) NOT NULL,
    t3_type VARCHAR(12) NOT NULL 
)

l        非空节制

sp_bindrule [@rulename = ] 'rulename',  [@objname = ]  ‘object_name’

2、外键限定

  外键既可以确认保证数据完整性,也能表现表之间的涉嫌。增多了外键之后,插入引用表的记录要么必需被援引表中被援引列的某条记下相称,要么外键列的值必得安装为NULL。

  外键和主键不相同等,每一个表中的外键数目不约束唯后生可畏性。在种种表中,每后生可畏有-~2伍十二个外键。唯后生可畏的范围是贰个列只好引用二个外键。多个列能够被八个外键援用。

  1、成立表的时候创制外键

图片 5;)

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

图片 6;)

  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贰零零陆中引进的,假设要合作到SQLServer2001的话,要制止接收那八个级联合浮动作。但是她们的才做是特别简单的:假若实行更新而改造了一个父行的值,那么子行的值将棉被服装置为NULL,只怕设置为该列的暗许值(不管SET NULL照旧SET DEFAULT)。

  4、外键另一方面的设想

    外键中的之独有入选只怕的挑精拣肥:

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

      通过定义援用列为NOT NULL,能够使外键完全都是必得的(即客商拉长数据时必需引用表中必需有相相称的一站式数据)。

    2、不填当作何值,而使该值为NULL。

      允许引用列有NULL值时,客户能够筛选不提供值-尽管在被援用表未有与NULL值相称的行,依然允许插入。

在建表时加多DEFAULT节制
CREATE TABLE table3(
    t3_id VARCHAR(12),
    t3_name VARCHAR(20),
    t3_class VARCHAR(12),
    t3_type VARCHAR(12) DEFAULT '类型1' 
)

为此有了以下推行完整性的门径:

例如: exec sp_bindrule 'r_grade','sc.grade‘ 

二、限制命名

  在念书约束此前,首先来精通下为束缚命名供给专心哪些地点。

  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、满足上述八个条件的场馆下简化名称。

删除Primary Key
ALTER TABLE table1
DROP CONSTRAINT t_idss;

封锁名与列名差异样,此处填写限定名

       UNIQUE- It can be specified even if NOT NULL is not, and the column is then constrained so that all non-null values in the table are unique, but multiple nulls can exist for this column.       

 

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'。
语句已终止。
删除CHECK约束
ALTER TABLE table3
DROP CONSTRAINT ck_t3_type;

触发器的介绍

 

  1. 1

    触发器(trigger卡塔 尔(英语:State of Qatar)是个独特的蕴藏进程,它的推行不是由程序调用,亦非手工业运行,而是由事件来触发,当对一个表张开操作( insert,delete, update卡塔尔时就能够激活它推行,触发器经常用来提升数据的完整性约束和作业法则等。其实往简单了说,就是触发器正是八个开关,担任灯的亮与灭,你动了,它就亮了,就以此意思。

    图片 7

    END

③拔除准绳的绑定

9、怎么样选用

  经过上述的就学,对于数据完整性,你会意识有很八种方可挑选,那么什么样筛选适合的封锁呢?

限制 优点 缺点
约束

快速

可以引用其他列

在命令执行前发生

遵循ANSI标准

必须对每个表重新定义

不能引用其他表

不能绑定到数据类型

规则

独立的对象

可重用

可以绑定到数据类型

命令执行前发生

稍慢

不能跨列使用

不能引用其他表

实际上只用于向后兼容

默认值

非常灵活

可以引用其他列或其他表

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

在命令执行之后发生

系统开销很大

  假如要促成更壮的逻辑模型以至左近选择客商自定义数据类型,则相符选用法则和默许值。在这里种景观下法规和暗中同意值能够提供比非常多职能,轻松管理,而不用太多的编制程序开支。

  独有在无法选取约束时使用触发器。和平契约束同样,他们被增大到表中,并且必得对成立的每种表重新定义。好的上边是触发器大致能够做数据完整性方面包车型客车任何操作。实际上再未有现身外键时,他们常被看作外键的庖代品。

  而在别的意况下,应将封锁作为数据完整性施工方案的取舍。它们试行进度快,况且轻巧创制。他们的后天不良是效果与利益有限(除了外键节制,都不能够援引其余表),何况对于通用限制逻辑来说,必要一回次地再一次定义。

删除NOT NULL约束
ALTER TABLE table3
ALTER COLUMN t3_type VARCHAR(12) NULL;
GO

又称作DEFAULT约束。将常用的数量值性以为暗中认可值能够节省客户输入的小时,在非空字段中定义私下认可值能够减小不当爆发。在实际上利用中,暗中同意值仍然是能够是结果能变的函数。

缺省与法则有以下特点:

生机勃勃、节制的归类

  在SQLServer中,有3种不一致品种的节制。

  1、实体节制

    实体约束是有关行的,例如某豆蔻梢头行现身的值就不允许出今后别的行,举个例子主键。

  2、域约束

    域限定是有关列的,对于有着行,某一列有这几个限制,比如CHECK限定。

  3、参照完整性约束

    即使某列的值必需与其它列的值十分,那就表示须要七个参照完整性限制,举例外键。

在创设表的时候加多CHECK 节制
CREATE TABLE table3(
    t3_id VARCHAR(12),
    t3_name VARCHAR(20),
    t3_class VARCHAR(12),
    t3_type VARCHAR(12),
    CONSTRAINT ck_t3_type CHECK(t3_type in('类型1','类型2','类型3')) 
)

增加了封锁后只要插入不适合限定的数码

INSERT INTO table3(
    t3_id,
    t3_name,
    t3_class,
    t3_type
)VALUES(
'2018038219',
'李建',
'社会与科学',
'任何数据'
);

消息547,级别16,状态0,第1 行
INSERT 语句与CHECK 约束"ck_t3_type"冲突。该冲突发生于数据库"test",表"dbo.table3", column 't3_type'。
言辞已终止。

           图片 8

⑤删减暗许对象

5、DEFAULT约束

  和具有节制同样,DEFAULT节制也是表定义的二个组成部分,它定义了当插入的新行对于定义了暗中同意节制的列未提供相应数额时该如何是好。能够定义它为一个字面值(举个例子,设置私下认可薪俸为0,也许安装字符串列为"UNKNOWN"),可能有些系统值(getdate())。

  对于DEFAULT限定,要打听以下几个特色:

  1、暗中同意值只在insert语句中央银行使-在update语句和delete语句中被忽略。

  2、借使在insert语句中提供了任性值,这就不利用默许值。

  3、若无提供值,那么总是选取暗中认可值。

  值得注意的是,update命令的法则由二个莫衷一是,借使彰显表明使用默许值正是莫衷一是。可以透过利用首要字DEFAULT表示更新的值设置为暗中同意值。

  5.1在创造表时定义DEFAULT约束:

图片 9;)

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

图片 10;)

  在实行语句后:

insert into person (person_age) values(24)

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

  图片 11

   5.2在已存在的表上增加DEFAULT节制:

alter table person
    add constraint CN_DefaultName
    default    '无名氏' for person_name
外关键字节制(Foreign Key Constraint卡塔尔

概念了表之间的涉嫌,用来维护四个表之间的大器晚成致性的涉及。
在开立表时创制Foreign Key Constraint

CREATE TABLE table2(
    s_id VARCHAR(20),
    s_name VARCHAR(12),
    s_tellphone VARCHAR(11),
    s_address VARCHAR(20),
    CONSTRAINT PK_s_id PRIMARY KEY(s_id),
);--首先新建table2,设置s_id为主键

CREATE TABLE table1(
    t_id VARCHAR(12),
    s_id VARCHAR(20),
    score FLOAT,
    CONSTRAINT pk_ts_id PRIMARY KEY(t_id,s_id),--新建table1,对t_id和s_id设置联合主键,键名pk_ts_id
    CONSTRAINT fk_s_id FOREIGN KEY(s_id)--对s_id设置外键fk_s_id
    REFERENCES table2(s_id)--外键fk_s_id外键关联table2的列s_id
    ON DELETE CASCADE--设置在table1的s_id删除时table2的s_id同时删除
    ON UPDATE CASCADE--设置在table1的s_id更新时table2的s_id同时更新
);

注:对table1设置外键关联table2,在插入数据时供给先插入table2的数额,本领学有所成插入table1的数额。更正table2.s_id数据,table1.s_id数据也会自动改变。可是改良table1.s_id数据,实施时报外键冲突。总的来说对table1设置外键关联table2后,table1的多寡跟着table2走,不能够反着来。

丰硕和删除了这些之外键节制同主键。

       CONSTRAINT-allows us to specify a name for each constraint other than NOT NULL, so that we can later drop the constraint with an ALTER Table statement.

(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关键字并且当前表中还并未有集中索引。
  •     各个表中只可以有八个主键,但可以由四个唯大器晚成约束。
主关键字节制(Primary Key Constraint卡塔尔

用来钦命表中的一列或几列组合的值在表中颇有唯生龙活虎性。建设构造主键的目标是让外键来援用。

开创法则

DBMS若觉察客商的操作违背了完整性约束原则,就选择一定的动作以保险数据的完整性,如回绝施行该操作,或级联实行别的操作。

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的选项来运转ALTE福睿斯语句,那样就能够撤销需求的自律。

  先来寻访上节中开创的这几个约束:

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

  图片 12

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

  当要启用限定时,只要求用将语句中的NO CHECK替换为CHECK就可以了:

Alter Table Account
    CHECK
    constraint CN_AccountAge18

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

  图片 13

   留意到status_enabled列形成了Enabled。

  status_enabled的三种情状如下:

  Enabled:启用;

  Disabled:禁用;

多列组合增添主键节制
CREATE TABLE table1(
    t_id VARCHAR(12),
    s_id VARCHAR(20),
    score FLOAT,
    CONSTRAINT ts_id PRIMARY KEY(t_id,s_id)
);

  ->保障数据完整性(首要指数据的准确与生龙活虎致性卡塔尔是数据库管理员的最关键职务之豆蔻梢头。

②绑定暗中同意值对象

三、键约束

对列解绑默许值对象
USE test
GO
EXEC sp_unbindefault 'table3.t3_date1';

此刻大家再次尝试删除默许值对象,开采依然特别,这个时候要留意,在地点的操作中,暗许值对象date_today不仅仅绑定了t3_date1列,还绑定了自定义数据类型date_time,并将该数据类型定义给了t3_date列,大家还须要对date_time解绑暗中同意值对象。

EXEC sp_unbindefault 'date_time';

那个时候重新删除暗中同意值对象,就足以成功删除。删除暗中同意值对象后,原先绑定的字段不会再有暗许值。

       CHECK

驷比不上舌操作:

8、触发器

  触发器也能够用于落到实处数据完整性,那几个内容超级多,新建生龙活虎篇作品陈述。

查看自定义准则
EXEC sp_help 'score_rule';

结果如图所示
图片 14

图片 15 

准绳无法绑定到text、image或timestamp列。

为已存在的列增添NOT NULL节制
ALTER TABLE table3
ALTER COLUMN t3_type VARCHAR(12) NOT NULL;

数量的完整性:数据的完整性是指数据库中多少的没有错和意气风发致性,表内的数量不相冲突,表间的数量不相矛盾,关联性不被损坏。

 

删除DEFAULT约束
ALTER TABLE table3
DROP CONSTRAINT DF__table3__t3_type__3D5E1FD2;
--DF__table3__t3_type__3D5E1FD2是DEFAULT约束的约束名

3.        对表之间、列之间关系的支配:外键限制、数据注明约束、触发器、存款和储蓄进度。

 

DEFAULT约束

因此定义列的默许值或使用数据库的默许值对象绑定表列,来钦命列的私下认可值。

                 

 

去除自定义准则

和自定义默许值对象同样,删除自定义法则要求该准则先与字段和自定义数据类型解绑。在地点的操作中,score_rule准则与自定义数据类型score_type以及列mt_score已绑定。因而奉行以下语句:

EXEC sp_unbindrule 'score_type';
GO--解除规则score_rule与score_type之间的绑定
EXEC sp_unbindrule 'table_score.mt_score';
GO--解除规则score_rule与表table_score的mt_score列的绑定
DROP RULE score_rule;--删除score_rule规则

注:经过试验,叁个列只好绑定1条准则,假如对二个列绑定2条准绳,前一条法规会被后一条准则顶替。

Catalogs

完整性约束命名子句的格式:

累积进度查询私下认可值对象的主人
USE test
EXEC sp_help date_today;
GO

结果如图所示
图片 16

l        数据评释限定

缺省和准则来源于由Sybase开采的S暗中同意值QL Server,在老版本的SQL Server大概晋级版本中都有缺省和法则的应用。

增加封锁钦定限制名
ALTER TABLE table3
ADD CONSTRAINT df_t3_type
DEFAULT '类型2' FOR t3_type;
GO

4)       法则能够采用于四个列,CHECK约束只针对它定义的列。

④CHECK约束

加上Primary Key的另风华正茂种示例
ALTER TABLE Products
ADD PRIMARY KEY(prod_id);

虽说上述代码运维没问题,查看表格设计也得以观察Primary Key设置成功,不过在剔除Primary Key操作时会提醒:
消息3728,级别16,状态1,第1 行
'prod_id' 不是封锁。
消息3727,级别16,状态0,第1 行
不能够删除约束。请参阅前边的错误音讯。
原因是增进Primary Key语句中并未有用CONSTRAINT指明限定名,系统自动生成了主键名和平合同束名,要先查看主键名和平条节制名,删除时填写的也是封锁名。
这种气象的科学删除方法

ALTER TABLE Products
DROP CONSTRAINT CK__Products__prod_p__1A14E395;
ALTER TABLE Products
DROP CONSTRAINT PK__Products__56958AB222AA2996;

       PRIMARY KEY -A column with the PRIMARY KEY column constraint is implicitly defined to be NOT NULL and UNIQUE. The UNIQUE clause and PRIMARY KEY clause cannot both be used for a column, although the PRIMARY KEY clause and the NOT NULL clause can be used together.

 

UNIQUE约束

除主键外另风流倜傥种能够定义唯大器晚成限定的品种,允许空值。增添UNIQUE的章程同上,这里只简轻易单比方。

USE test
GO
ALTER TABLE table2
ADD CONSTRAINT uk_s_tellphone
UNIQUE(s_tellphone);

              图片 17

意气风发、数据库完整性概述

向原来就有表中加多Primary Key
ALTER TABLE table1
ADD CONSTRAINT t_idss
PRIMARY KEY(t_id);

外键:FOREIGN KEY,外键用来在八个表的数额里面创建连接,它能够是一列可能多列。一个表能够有五个依旧多少个外键。外键对应的是参照完整性,二个表的外键可认为空值,若不为空值则每贰个外键值必得等于另一个表中主键的有些值。

exec sp_unbindrule 'sc.grade' 

删除暗中认可值对象
DROP DEFAULT date_today;

去除不成功,提醒以下音讯:
消息3716,级别16,状态3,第1 行
不恐怕删除暗中同意值'date_today',因为它已绑定到二个或七个列。
那么大家精晓,当三个私下认可值对象绑定了列其后,就不恐怕删除它,假若想要删除,就亟须先解绑。在上边的操作中,我们的暗中同意值对象date_today绑定了test数据库table3表的t3_date1字段。

那几个渠道得以依据项目分为:节制、法规、默许值、触发器、存款和储蓄进度。

 

翻看自定义法则的概念音讯
EXEC sp_helptext 'score_rule';
GO

结果如图所示
图片 18

     数据具备复杂的数据类型,用来满足区别的急需。实际利用中的数据也颇负必然的取值范围,如年龄十分的大于0,性别唯有儿女等。而表之间的牵连使相连的字段要保持豆蔻梢头致和总体。不过,实操不也许作保插入和删除的数额都切合须要,不符合供给的操作极或然会损坏数据的完整性,对数据库的可信性和平运动行本事变成威吓。

①提供定义完整性节制标准的体制

NOT NULL约束

封锁字段值不为空。

The GRANT & REVOKE statements

二、缺省(默认值)和规则

约束

触发器步骤详整

 

  1. 1

    先是,大家来尝试创制二个触发器,供给正是在AddTable那一个表上创设三个Update触发器,语句为:

    create trigger mytrigger on AddTable
    for update

    图片 19

  2. 2

    下一场就是sql语句的风姿罗曼蒂克部分了,首假使意气风发旦产生update现在,供给触发器触发二个什么样操作。这里的意思正是假诺现身update了,触发器就能够触发输出:the table was updated!---By 小猪也万般无奈。

    图片 20

  3. 3

    接下去大家来将AddTable表中的数据实践二个改动的操作:

    图片 21

  4. 4

    推行后,大家会意识,触发器被触发,输出了大家设置好的文件:

    图片 22

  5. 5

    那触发器创建以往呢,它就正式启幕职业了,此时大家必要转移触发器的话,只供给将起始的create成立变为alter,然后改进逻辑就能够:

    图片 23

  6. 6

    比如我们想查看某二个触发器的原委,直接运转:exec sp_helptext [触发器名]

    图片 24

  7. 7

    若是本身想查询当前数据库中有稍许触发器,以有益小编实行数据库维护,只需求周转: select * from sysobjects where xtype='TR'

    图片 25

  8. 8

    我们只要急需关闭也许开启触发器的话,只须求周转:

    disable trigger [触发器名] on database --禁止使用触发器

    enable trigger [触发器名] on database --开启触发器

    图片 26

  9. 9

    那触发器的功效虽大,可是只要接触,复苏起来就相比费力了,那大家就需求对数据进行珍重,这里就需求用到rollback数据回滚~

    图片 27

  10. 10

    第九步的意思便是查询AddTable表,如若中间存在TableName=newTable的,数据就回滚,触发器中止,那我们再扩充一下测量试验,对AddTable表实行退换,发掘,触发update触发器之后,因为有数据保养,触发器中止:图片 28

    图片 29

  11.  

 图片 30

图片 31

图片 32

图片 33

图片 34

图片 35

图片 36

图片 37

图片 38

图片 39

图片 40

图片 41

图片 42

 

 图片 43

图片 44

图片 45

图片 46

图片 47

图片 48

图片 49

图片 50

图片 51

图片 52

图片 53

图片 54

图片 55

图片 56

图片 57

图片 58

图片 59

图片 60

图片 61

图片 62

图片 63

图片 64

图片 65

图片 66

图片 67

图片 68

图片 69

图片 70

 

应竭尽选用约束,任何能够动用缺省与法则的地点都有可以动用约束。

添加CHECK约束
ALTER TABLE table2
ADD sex CHAR(2);--在table表中添加sex,数据类型为CHAR,用来存放性别
GO
ALTER TABLE table2
ADD CONSTRAINT ck_sex CHECK(sex in('男','女'));

注:那时sex列数据类型不能够是bit,如果填写bit,只好存款和储蓄0和1,用CHECK约束限定结果为男和女就能够报错。

七个列是或不是同意有空值,正是此处的空和非空节制,即NULL与NOT NULL节制。NULL便是允许为空,NOT NULL正是不允许为空。NULL差异于0和“”,0和“”都意味为该行有数据,而NULL是尚未数据。

暗中认可值对象是单独存款和储蓄的,删除表的时候,DEFAULT节制会活动删除,可是暗许值对象不会被删去。

CHECK约束

分成表限制和列限定,用于约束字段值在有个别范围。

平整在绑定之后才得以利用,准绳的绑定须要时用系统存储进程sp_bindrule.

 

Primary Key的成立情势

在开立表时开立Primary Key

CREATE TABLE table1(
    t_id VARCHAR(12) ,
    t_name VARCHAR(20),
    t_phone VARCHAR(20),
    CONSTRAINT t_idss PRIMARY KEY(t_id)
);

对t_id列创造主键,约束名称为t_idss。

3)       四个列只好采纳一个平整却得以运用多少个CHECK约束。

 

CREATE DEFAULT 暗许值名

 

Security

未解除绑定的平整,如果重新将二个新的规行矩步绑定到列,旧的家有家规将机关被覆灭,唯有方今三次绑定的平整有效

       NOT NULL -If NOT NULL appears in a col_constr, then the DEFAULT clause cannot specify NULL;

sp_unbindrule [@objname = ] 'object name'  [,[@futureonly = ] 'futureonly_ lag']

默认值:

(3)假若本来就有PPAJEROIMASportageY KEY约束,则可对其进展退换或删除。

又叫UNIQUE限定,在主键节制中也接收了唯风姿罗曼蒂克性,差异的是二个表中能够有八个那样的唯生机勃勃性列,却只得有三个主键。这里的独一无二性列可感到空但是一定要有生龙活虎行数据为空。适用于不是主键但却依旧供给具备唯豆蔻梢头性的字段。

(7)UNIQUE约束优先于独一索引。

Go

(1)作为表定义的一片段在成立表时创办。

     ->参照完整性(Referential Integrity卡塔 尔(英语:State of Qatar):参照完整性维护表与表之间的相关性,平时用“主键(Primary Key)/外键(Foreign Key)”保险,当中Foreign Key能够取NULL值,或取其参照表中Primary Key大概候选键的取值。

在剔除暗许对象在此之前,首先要确定暗许对象已经去掉绑定。删除暗中同意对象使用DROP DEFAULT语句。其语法格式如下:

主键:PLacrosseIMA智跑Y KEY,主关键字,用来界定列的数码颇有唯一性且不为空,即这一字段的数额还没重新的多少值且不可能有空值。种种表只可以有二个主键,通常用来做标记。

 

CREATE RULE 规则名

 

Sp_bindrule 规则名 表名.字段名

 

1)       法规是SQL Server的对象而CHECK是生龙活虎种限定,是表定义的黄金年代某些。

 

       图片 71

⑥IDENTITY 约束

    ->顾客定义的完整性(User_defined Integrity ):针对某意气风发具体数据的牢笼原则,由应用碰着决定。举例:某些属性具有缺省值、有些属性必得取惟意气风发值(UNIQUE)、有些非主属性不能够取NULL值、某些属性的取值范围在0~100中间(CHECK)等等。

 

l        主键约束

exec sp_helptext d_grade 

-》》》完整性再演说

 

  ->Then provide views(视图) of the data, virtually restructuring the physical tables into variant(不同的) table forms, to simplify access to data.

③UNIQUE 约束

平整是单身的SQL Server对象,跟表和视图相符是数据库的组成都部队分。法规的意义和CHECK节制相同,用于实现对数据值的考查。它能够提到到多个表,在数据库中有邮局插入、改善时,验证新数据是或不是符合法规,是落实域完整性的主意之生机勃勃。准则在概念时并未定义它的检查实验对象,而是在开创后绑定到目的来检查测试数据。

(1)CHECK限制通过限定顾客输入的值来抓实域完整性。

  ->数据完整性具体达成包罗两类

①创立暗中认可对象

能够自动编号的列称为标记列或IDENTITY约束。IDENTITY限制便是为这个数值顺序依次增加的列希图的束缚,自动完成数值的拉长。种种表只可以有四个标记列,标记数据不能够由顾客输入,客商只须要填写标识种子(标志列的第一个数据)和标记增量(依次增加的数),系统自动生成多少并填入表。标记种子和标识增量都以非零整数,位数紧跟于等于10。暗许两个均为1。

 

2)       CHECK的前期级要超过法则。

(1)作为表定义的一片段在开立表时创设。

 

 

触发器的归类

 

  1. 1

    DML( 数据操纵语言 Data Manipulation Language卡塔尔国触发器:是指触发器在数据库中生出DML事件时将启用。DML事件即指在表或视图中期维修改数据的insert、update、delete语句。

  2. 2

    DDL(数据定义语言 Data Definition Language卡塔 尔(英语:State of Qatar)触发器:是指当服务器或数据库中发出(DDL事件时将启用。DDL事件即指在表或索引中的create、alter、drop语句也。

  3. 3

    登录触发器:是指当顾客登陆SQL SE奔驰G级VE福特Explorer实例创设会话时接触。

    END

  

           

 

  ->The structure of the various tables, views, and other objects of a database are made available to the DBA through a set of system-defined tables, called system catalogs(系统目录).

学子所在的系必得是这个学校实行的系;

本文由1010cc时时彩标准版发布于1010cc三分网站,转载请注明出处:的封锁标准,二零一零从入门到明白

关键词:

上一篇:【1010cc时时彩标准版】使用sql脚本输出交替不同

下一篇:没有了