在创建表时创建Primary Key,  1、实体约束

作者: www.9159.com  发布:2019-09-11

约束

www.9159.com 1 

一、数据库完整性概述

SQLServer - 约束

主关键字约束(Primary Key Constraint)

用来钦定表中的一列或几列组合的值在表中具备唯一性。创设主键的目标是让外键来援用。

from Database Design to Physical Form

 

一、约束的分类

  在SQLServer中,有3种分歧等级次序的牢笼。

  1、实体约束

    实体约束是关于行的,比方某一行出现的值就不允许出现在任何行,举个例子主键。

  2、域约束

    域约束是有关列的,对于全数行,某一列有那个约束,举个例子CHECK约束。

  3、参照完整性约束

    如若某列的值必得与其余列的值格外,那就象征要求二个参阅完整性约束,比如外键。

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。

CREATE TABLE

1.数据库的完整性:

二、约束命名

  在读书约束此前,首先来精通下为束缚命名要求注意哪些地点。

  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;

封锁名与列名不一致,此处填写约束名

integrity constraints (完整性约束)

 

三、键约束

向已有表中增添Primary Key
ALTER TABLE table1
ADD CONSTRAINT t_idss
PRIMARY KEY(t_id);

CREATE VIEW

①数据库的完整性是指多少的没错和相容性

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

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

www.9159.com 2;)

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

www.9159.com 3;)

加上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;

Security

②数据库完整性是谨防不合语义或不科学的数量走入数据库

2、外键约束

  外键不只能确定保证数据完整性,也能彰显表之间的涉及。增多了外键之后,插入引用表的笔录要么必需被引用表中被援引列的某条记下相配,要么外键列的值必得设置为NULL。

  外键和主键差异,每一种表中的外键数目不限量唯一性。在各种表中,每一有-~254个外键。独一的界定是一个列只可以引用二个外键。叁个列能够被四个外键援引。

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

www.9159.com 4;)

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

www.9159.com 5;)

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

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

The GRANT & REVOKE statements

③完整性展现了是还是不是真正地反映现实世界

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关键字並且当前表中还尚未聚焦索引。
  •     每种表中只好有三个主键,但足以由多少个唯一约束。
外关键字约束(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走,不可能反着来。

加多和删除了这些之外键约束同主键。

Catalogs

 

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'。
语句已终止。
UNIQUE约束

除主键外另一种能够定义独一约束的品种,允许空值。加多UNIQUE的法子同上,这里只简单比如。

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

Schemas

例: 

5、DEFAULT约束

  和持有约束同样,DEFAULT约束也是表定义的三个组成都部队分,它定义了当插入的新行对于定义了暗许约束的列未提供相应数额时该怎么做。能够定义它为二个字面值(譬如,设置暗中同意薪金为0,大概安装字符串列为"UNKNOWN"),可能有个别系统值(getdate())。

  对于DEFAULT约束,要询问以下多少个特性:

  1、暗许值只在insert语句中应用-在update语句和delete语句中被忽略。

  2、如若在insert语句中提供了大肆值,那就不选取暗许值。

  3、若无提供值,那么总是利用暗中同意值。

  值得注意的是,update命令的平整由一个例外,假如显示表明使用暗中认可值正是例外。能够经过行使首要字DEFAULT表示更新的值设置为暗中认可值。

  5.1在成立表时概念DEFAULT约束:

www.9159.com 6;)

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

www.9159.com 7;)

  在执行语句后:

insert into person (person_age) values(24)

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

  www.9159.com 8

   5.2在已存在的表上增多DEFAULT约束:

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

分为表约束和列约束,用于限制字段值在某些范围。

Introduction

学生的岁数必得是整数,取值范围为14-29;

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的选项来运营ALTETucson语句,那样就可见撤废须求的牢笼。

  先来看看上节中创设的那个约束:

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

  www.9159.com 9

   留意到status_enabled名列Disabled表明是剥夺的乐趣。

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

Alter Table Account
    CHECK
    constraint CN_AccountAge18

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

  www.9159.com 10

   留意到status_enabled列产生了Enabled。

  status_enabled的三种境况如下:

  Enabled:启用;

  Disabled:禁用;

添加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约束限制结果为男和女就能够报错。

  ->The DBA(数据库管理员) must begin by creating the tables and constraints(约束) and loading the data. Impose(强加上) integrity constraints on the columns 。

学员的性别只可以是男或女;

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

在创造表的时候加多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'。
话语已告一段落。

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

学员的学号一定是独一的;

8、触发器

  触发器也能够用于落到实处数据完整性,那么些剧情非常多,新建一篇文章陈诉。

删除CHECK约束
ALTER TABLE table3
DROP CONSTRAINT ck_t3_type;

  ->Provide security(安全性), so that only authorized users are able to read or update certain confidential(机密的) data.

学生所在的系必需是全校设置的系;

9、怎样选拔

  经过以上的求学,对于数据完整性,你会意识有相当多样方可挑选,那么如何挑选适合的束缚呢?

限制 优点 缺点
约束

快速

可以引用其他列

在命令执行前发生

遵循ANSI标准

必须对每个表重新定义

不能引用其他表

不能绑定到数据类型

规则

独立的对象

可重用

可以绑定到数据类型

命令执行前发生

稍慢

不能跨列使用

不能引用其他表

实际上只用于向后兼容

默认值

非常灵活

可以引用其他列或其他表

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

在命令执行之后发生

系统开销很大

  假使要兑现越来越硬朗的逻辑模型以及广泛使用顾客自定义数据类型,则一般采用准绳和默许值。在这种状态下法规和暗中认可值能够提供多数效果与利益,轻松处理,而不用太多的编制程序费用。

  独有在无法采取约束时利用触发器。和自律一样,他们被增大到表中,何况必需对创立的各个表重新定义。好的方面是触发器大概能够做数据完整性方面包车型地铁另外操作。实际上再未有出现外键时,他们常被当做外键的代替品。

  而在另外景况下,应将约束作为数据完整性应用方案的抉择。它们实行进度快,并且轻易创建。他们的症结是效率有限(除了外键约束,都不可能援用其余表),何况对于通用约束逻辑来讲,必要一回次地重复定义。

DEFAULT约束

透过定义列的暗中同意值或选择数据库的私下认可值对象绑定表列,来钦赐列的暗中同意值。

  ->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(系统目录).

 

在建表时增添DEFAULT约束
CREATE TABLE table3(
    t3_id VARCHAR(12),
    t3_name VARCHAR(20),
    t3_class VARCHAR(12),
    t3_type VARCHAR(12) DEFAULT '类型1' 
)

 

 

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

Integrity(完整性)

2.DBMS护卫数据库完整性的体制:

加上封锁不内定约束名
ALTER TABLE table3
ADD DEFAULT '类型2' FOR t3_type;
GO

  ->保险数据完整性(重要指数据的不错与一致性)是数据库管理员的最注重职务之一。

 

加多封锁钦赐约束名
ALTER TABLE table3
ADD CONSTRAINT df_t3_type
DEFAULT '类型2' FOR t3_type;
GO

  ->能够经过自律(Constraint)、法则(Rule)也许缺省值有限支撑数据的完整性,也足以在选取程序层保险数据完整性(那是应用程序设计的主题素材),或通过触发器保险。

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

NOT NULL约束

封锁字段值不为空。

  ->数据完整性类型富含:实体完整性、参照完整性和顾客定义完整性  

   DBMS应提供定义数据库完整性约束原则,并把它们存入数据库中。

建表时设置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 
)

    ->实体完整性(Entity Integrity) :现实世界的实业是可分其他,即它们持有某种独一性标志。相应地,关系模型中主键应作为独一性标记。因而实体完整性法规规定基本关系的具备主键(Primary Key)都不能够取空值(NULL) 。

②提供完整性检查的法子

为已存在的列增加NOT NULL约束
ALTER TABLE table3
ALTER COLUMN t3_type VARCHAR(12) NOT NULL;

     ->参照完整性(Referential Integrity) :参照完整性维护表与表之间的相关性,平常用“主键(Primary Key)/外键(Foreign Key)”保障,其中Foreign Key能够取NULL值,或取其参照表中Primary Key也许候选键的取值。

   检查数据是不是知足完整性约束规范的编制称为完整性检查。一般在INSERT、UPDATE、DELETE语句试行后初叶反省。

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

    ->客户定义的完整性(User_defined Integrity ):针对某一具体数额的牢笼原则,由应用遇到决定。比方:某个属性具备缺省值、某些属性必需取惟一值(UNIQUE)、有些非主属性不能够取NULL值、有个别属性的取值范围在0~100之内(CHECK)等等。

 

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

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是否有默认值为当前日期

查询结果如下
www.9159.com 11

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

查询结果如下
www.9159.com 12

  ->数据完整性具体贯彻富含两类

3.违背合同管理

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

结果如图所示
www.9159.com 13

    ->注脚性数据全部性 :申明性数据总体性用约束(Constraint)、准则(Rule) 在数据库中提供保险,这是保障完整性的较好方式。它驻留在数据库内,编制程序轻便,开支小,能更集中管理和保险数据的一致性

DBMS若发掘客商的操作违背了完整性约束规范,就使用一定的动作以有限协理数据的完整性,如拒绝实施该操作,或级联施行别的操作。

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

剔除不成事,提醒以下音讯:
消息3716,级别16,状态3,第1 行
比异常的小概删除默许值'date_today',因为它已绑定到多少个或四个列。
那正是说我们明白,当二个暗中认可值对象绑定了列之后,就无法删除它,即使想要删除,就不能够不先解绑。在下面的操作中,大家的暗中同意值对象date_today绑定了test数据库table3表的t3_date1字段。

    ->进程性数据总体性 :进程性数据完整性用触发器和应用程序代码有限支撑,常常相比较复杂、费用十分的大,但足以实施越来越多的业务准则。 平日,进程性数据完整性是评释性数据完整性的补给

 

对列解绑暗中同意值对象
USE test
GO
EXEC sp_unbindefault 'table3.t3_date1';

此时我们再次尝试删除暗中同意值对象,开采依然十二分,此时要潜心,在上头的操作中,暗中认可值对象date_today不唯有绑定了t3_date1列,还绑定了自定义数据类型date_time,并将该数据类型定义给了t3_date列,我们还亟需对date_time解绑暗中认可值对象。

EXEC sp_unbindefault 'date_time';

那时再次删除私下认可值对象,就足以成功删除。删除私下认可值对象后,原先绑定的字段不会再有暗中同意值。

           www.9159.com 14

www.9159.com 15

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

准则是对列或自定义数据类型的值的明确和限量。自定义准绳的表明式应当要赶回布尔类型的值,并且表达式中不可能包蕴多少个变量。

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 行
在应利用准绳的上下文(在';' 周边)中钦点了非布尔类型的表达式。

                 www.9159.com 16

 

删去自定义规则

和自定义默许值对象相同,删除自定义准绳供给该法则先与字段和自定义数据类型解绑。在上边的操作中,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条准则,前一条法则会被后一条法则顶替。

           

 

查看自定义法规
EXEC sp_help 'score_rule';

结果如图所示
www.9159.com 17

-》》》完整性再解说

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

翻看自定义准则的概念信息
EXEC sp_helptext 'score_rule';
GO

结果如图所示
www.9159.com 18

     数据具备复杂的数据类型,用来满意不相同的急需。实际利用中的数据也是有所必然的取值范围,如年龄非常的大于0,性别唯有儿女等。而表之间的关联使相连的字段要保持一致和一体化。不过,实操不可能担保插入和删除的数额都符合须求,不符合供给的操作相当大概会破坏数据的完整性,对数据库的可信性和平运动行本事形成威迫。

 

就此存放数据集的数据库须求求对数据表和列有所限制和规范,为此SQLServer系统使用一名目很多的法子来维护数据完整性。

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

数量的完整性:数据的完整性是指数据库中数量的不利和一致性,表内的数额不相冲突,表间的多少不相冲突,关联性不被毁损。

缺省是为列提供数据的一种艺术,即便客商展开INSERT操作时不为列输入数据,则采纳缺省值。

为此有了以下试行完整性的不二等秘书籍:

法则是当顾客实行INSERT或uPDATE操作时,对输入列中的数据设定的取值范围,是落实域完整性的秘诀之一。

1.        对列数据的主宰:数据评释约束、私下认可值约束、准则。

 

2.        对列的支配:主键约束、独一性约束、标志列。

缺省与法则有以下特点:

3.        对表之间、列之间涉及的主宰:外键约束、数听表达约束、触发器、存款和储蓄进程。

(1)缺省与法则是数据库对象,它们是单身于表和列而树立的。

这一个路子得以根据项目分为:约束、准则、默许值、触发器、存款和储蓄进度。

(2)缺省与法则创设后与列或数据类型产生关联,列和数据类型就具有了缺省与法则的性子。

自律分为以下几点:

(3)缺省与准绳定义后,可以重复使用,能够绑定到几个列或数据类型上。

l        主键约束

(4)缺省与准则不随表同有的时候间调入内部存款和储蓄器,当用到时才被调入内部存款和储蓄器,那说不定会使程序施行出现延时。

主键:PRubiconIMAKugaY KEY,主关键字,用来界定列的数码颇具独一性且不为空,即这一字段的数额未有再一次的多少值且无法有空值。每种表只好有一个主键,一般用来做标志。

 

l        外键约束

缺省和法规对象平日只在它所开创的数据库中央银立竿见影,不是ANSI标准,一般不提倡使用。

外键:FOREIGN KEY,外键用来在八个表的多少里面创建连接,它能够是一列大概多列。二个表能够有三个要么几个外键。外键对应的是参照完整性,二个表的外键可认为空值,若不为空值则每三个外键值必需等于另一个表中主键的某些值。

应尽量使用约束,任何能够行使缺省与法规的地点都有能够动用约束。

l        标识列

 

可以自行编号的列称为标记列或IDENTITY约束。IDENTITY约束就是为那么些数值顺序递增的列计划的封锁,自动完结数值的丰裕。每一种表只能有贰个标志列,标识数据不能够由客户输入,客户只须求填写标识种子(标记列的率先个数据)和标识增量(依次扩展的数),系统自动生成数据并填入表。标志种子和标记增量都以非零整数,位数紧跟于等于10。暗中同意两个均为1。

1. 缺省

l        独一性约束

在SQL Server中,有三种采用暗中认可值的办法:

又叫UNIQUE约束,在主键约束中也选拔了独一性,分歧的是三个表中能够有八个那样的独一性列,却只好有三个主键。这里的独占鳌头性列可以为空可是只可以有一行数据为空。适用于不是主键但却如故要求具有独一性的字段。

 

l        非空约束

①在开立表时,钦赐暗中认可值。

叁个列是或不是同意有空值,正是这里的空和非空约束,即NULL与NOT NULL约束。NULL正是同意为空,NOT NULL正是不容许为空。NULL差异于0和“”,0和“”都意味着为该行有数量,而NULL是从未有过数量。

  用SQL Server Management Studio创立表时在规划表时钦命暗中认可值,能够在输入字段名称后,设定该字段的私下认可值。

l        数据表明约束

  或行使CREATE TABLE语句中的DEFAULT子句钦赐默许值。

又称做CHECK约束,它通过给定条件(逻辑表达式)来检查输入数据是还是不是符合供给,以此来爱慕数据完整性。

 

l        暗许值约束

②运用CREATE DEFAULT语句创制暗许对象后,使用存款和储蓄进度sp_bindefault将该暗中认可对象绑定到列上。

又称作DEFAULT约束。将常用的多寡值性感到默许值能够节约客户输入的时间,在非空字段中定义私下认可值能够减掉不当发生。在其实使用中,私下认可值还足以是结果能变的函数。

 

 

暗中同意值对象是单身存款和储蓄的,删除表的时候,DEFAULT约束会自动删除,但是默许值对象不会被剔除。

规则:

创办私下认可值对象后,供给将其绑定到某列恐怕顾客自定义的数据类型上。

法则是独立的SQL Server对象,跟表和视图同样是数据库的组成都部队分。法则的效果与利益和CHECK约束类似,用于达成对数据值的查检。它能够提到到三个表,在数据库中有邮局插入、修改时,验证新数据是还是不是符合法则,是实现域完整性的法子之一。法规在概念时并从未概念它的检查实验对象,而是在创设后绑定到目的来检验数据。

 

创立法规

主要操作:

CREATE RULE 规则名

 

AS

①创造默许值对象

规范表达式

②绑定私下认可值对象

在那边的口径表明式使用逻辑表明式,表明式中要有三个@起始的变量,代表顾客的输入数据,能够作为是代表WHERE前面包车型客车列名。

③解除暗许值对象的绑定

法则在绑定之后技术够应用,准绳的绑定必要时用系统存款和储蓄进程sp_bindrule.

④查看默许值对象

USE 数据库名

⑤删除暗许值对象

Go

 

Sp_bindrule 规则名 表名.字段名

 

应用存款和储蓄进度sp_help来查思想则。

①创办私下认可对象

平整的表征(与CHECK的例外)

能够应用CREATE DEFAULT语句创造私下认可对象。其语法格式如下:

1)       法规是SQL Server的靶子而CHECK是一种约束,是表定义的一有的。

CREATE DEFAULT default  AS constant_expression 

2)       CHECK的预先级要超越准绳。

例如: create default d_grade as 1 

3)       多个列只可以动用三个法规却得以动用多个CHECK约束。

 

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

②绑定私下认可对象

5)       准绳创设一回能够使用频仍而CHECK约束供给频仍开立。

私下认可对象创设后不可能采纳,必需首先将其绑定到某列可能客户自定义的数据类型上。其利用语法格式如下:

默认值:

sp_bindefault [@defname = ] 'default', [www.9159.com,@objname = ] 'object_name'   [, [@futureonly = ] 'futureonly_flag']

CREATE DEFAULT 私下认可值名

其中: [, [@futureonly = ] ‘futureonly_flag’]仅在此之后将暗中认可值绑定到客户定义的数据类型时才使用。

AS 常亮表明式

例如: exec sp_bindefault 'd_grade', ‘sc.grade' 

与创制法则同样,暗许值的定义不可能蕴涵列名,要求绑定到列或是别的数据库对象能力选用。一个列只好绑定贰个暗中同意值

 

 

③拔除私下认可对象的绑定

Definition 7.1.2 Column Constraint

解除绑定可以接纳sp_unbindefault存款和储蓄进程。其语法格式如下:

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

sp_unbindefault [@objname = ] 'object_name'

       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.

例如: exec sp_unbindefault ‘sc.grade' 

       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.       

 

       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.

④查看默许对象

       CHECK

 

       EXAMPLE

exec sp_help d_grade 

       www.9159.com 19

 

              www.9159.com 20

exec sp_helptext d_grade 

 

 

                      www.9159.com 21

 

                    触发器

⑤刨除暗中同意对象

                 

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

触发器的介绍

 

  1. 1

    触发器(trigger)是个极度的存款和储蓄进程,它的实施不是由程序调用,亦非手工业运维,而是由事件来触发,当对一个表展开操作( insert,delete, update)时就能够激活它试行,触发器平日用来做实数据的完整性约束和工作法规等。其实往轻松了说,正是触发器就是二个按钮,负担灯的亮与灭,你动了,它就亮了,就那么些意思。

    www.9159.com 22

    END

DROP DEFAULT {default} [,…n]

触发器的分类

 

  1. 1

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

  2. 2

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

  3. 3

    登入触发器:是指当客户登陆SQL SEEscortVE凯雷德实例创设会话时接触。

    END

例如: drop default d_grade 

DML触发器介绍

 

  1. 1

    在SQL SEEvoqueVE奥迪Q72010中,DML触发器的完结利用多个逻辑表DELETED和INSERTED。那五个表是建构在数据库服务器的内部存款和储蓄器中,大家唯有只读的权能。DELETED和INSERED表的构造和触发器所在的数据表的协会是一模二样的。当触发器实施到位后,它们也就能够被自动删除:INSERED表用于寄放你在操件insert、update、delete语句后,更新的笔录。比方你插入一条数据,那么就能够把那条记下插入到INSERTED表:DELETED表用于寄存你在操作 insert、update、delete语句前,你创立触发器表中数据。

  2. 2

    触发器可由此数据库中的相关表达成级联退换,能够强制比用CHECK约束定义的羁绊越来越复杂的牢笼。与 CHECK 约束不一致,触发器能够援引别的表中的列,比方触发器能够利用另二个表中的 SELECT 对比插入或更新的多少,以及推行其余操作。触发器也得以依据数量修改前后的表状态,再行选择对策。两个表中的多个同类触发器(INSERT、UPDATE 或 DELETE)允许行使三个分裂的战术以响应同贰个修改语句。

  3. 3

    还要,即便触发器功用庞大,轻便可信地达成无数繁杂的功用,为啥又要慎用?过多触发器会变成数据库及应用程序的护卫困难,同一时间对触发器过分的依附,势必影响数据库的协会,同时扩充了珍重的复杂程序。

    END

 

触发器步骤详解

 

  1. 1

    率先,我们来品尝制造二个触发器,供给正是在AddTable这一个表上成立一个Update触发器,语句为:

    create trigger mytrigger on AddTable
    for update

    www.9159.com 23

  2. 2

    然后正是sql语句的一部分了,首要是一旦产生update未来,须要触发器触发二个怎样操作。这里的情致便是假使出现update了,触发器就能触发输出:the table was updated!---By 小猪也无可奈何。

    www.9159.com 24

  3. 3

    接下去我们来将AddTable表中的数据实践二个更动的操作:

    www.9159.com 25

  4. 4

    进行后,我们会开采,触发器被触发,输出了大家设置好的文本:

    www.9159.com 26

  5. 5

    那触发器制造未来呢,它就规范开班职业了,那时候大家须求更改触发器的话,只必要将启幕的create创制变为alter,然后修改逻辑就可以:

    www.9159.com 27

  6. 6

    如果大家想查看某贰个触发器的剧情,直接运转:exec sp_helptext [触发器名]

    www.9159.com 28

  7. 7

    只要本身想查询当前数据库中有微微触发器,以有益本身实行数据库维护,只必要周转: select * from sysobjects where xtype='TR'

    www.9159.com 29

  8. 8

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

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

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

    www.9159.com 30

  9. 9

    那触发器的效果与利益虽大,但是只要触及,复苏起来就比较辛劳了,那我们就必要对数码举办爱抚,这里就须要用到rollback数据回滚~

    www.9159.com 31

  10. 10

    第九步的意思正是查询AddTable表,要是中间存在TableName=newTable的,数据就回滚,触发器中止,那我们再开展一下测验,对AddTable表实行转移,发掘,触发update触发器之后,因为有数据爱护,触发器中止:www.9159.com 32

    www.9159.com 33

  11.  

 www.9159.com 34

www.9159.com 35

www.9159.com 36

www.9159.com 37

www.9159.com 38

www.9159.com 39

www.9159.com 40

www.9159.com 41

www.9159.com 42

www.9159.com 43

www.9159.com 44

www.9159.com 45

www.9159.com 46

 

 www.9159.com 47

www.9159.com 48

www.9159.com 49

www.9159.com 50

www.9159.com 51

www.9159.com 52

www.9159.com 53

www.9159.com 54

www.9159.com 55

www.9159.com 56

www.9159.com 57

www.9159.com 58

www.9159.com 59

www.9159.com 60

www.9159.com 61

www.9159.com 62

www.9159.com 63

www.9159.com 64

www.9159.com 65

www.9159.com 66

www.9159.com 67

www.9159.com 68

www.9159.com 69

www.9159.com 70

www.9159.com 71

www.9159.com 72

www.9159.com 73

www.9159.com 74

 

2.规则

 

准则用以限制存款和储蓄在表中或顾客自定义数据类型的值,是单独的数据库对象。

将法规绑定到列或客户自定义数据类型时,准则才起效果。

表中的每列或每种顾客定义数据类型只好和一个平整绑定。但每列可使用八个CHECK约束。

假若要刨除准绳,应规定法规已经去掉绑定。

 

①创设法规

 

CREATE RULE语句,其语法格式如下:

CREATE RULE rulename AS condition_expression

 

其间各参数含义如下:

rulename  是新法则的名号。

condition_expression  是概念准绳的尺码。

例如:create rule r_grade as @grade<=100 and @grade>=0 

 

②绑定准则

 

使用sp_bindrule存款和储蓄进程,语法格式为:

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

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

 

注意:

平整不能够绑定到text、image或timestamp列。

假如准则与绑定的列不相配,SQL Server就要插入值时重返错误新闻。

未解决绑定的法规,假如重新将叁个新的条条框框绑定到列,旧的条条框框将活动被免除,唯有近期一回绑定的平整有效

借使列中带有CHECK约束,则CHECK约束优先。

 

③拔除准绳的绑定

 

使用sp_unbindrule存款和储蓄进程。语法格式如下:

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

例如:  

exec sp_unbindrule 'sc.grade' 

 

④去除准绳

率先要清除准绳的绑定,然后本事去除绑定

例如:drop rule r_grade 

  

三、约束

 

SQL Server 二零零六提供的强制数据完整性的机制:

 

①PRIMARY KEY 约束

②FOREIGN KEY 约束

③UNIQUE 约束

④CHECK 约束

⑤NOT NULL(非空性)

⑥IDENTITY 约束

 

利用约束优先于选拔触发器、规则和暗许值

询问优化器使用约束定义生成高质量的询问试行安排

 

 

①PRIMARY KEY 约束:

 

能够在底下情形下行使:

(1)作为表定义的一有个别在开创表时创办。

(2)增多到尚未有P奥迪Q7IMACRUISERY KEY约束的表中(八个表只可以有二个PLacrosseIMA中华VY KEY约束)。

(3)如若已有PKugaIMALX570Y KEY约束,则可对其进展改变或删除。

 

特点:

(1)每一个表都应有二个主键,主键值独一。

(2)主键内的别的列无法为空(null)。

(3)要运用TRansact-SQL修改P冠道IMA冠道Y KEY,必须先删除现成的PEnclaveIMA昂科拉Y KEY约束,然后再另行创造。

(4)成立表时钦命主键,sql server会自动创立一个名叫“PK_”且后跟表名的主键索引。若是不钦定索引类型,则暗中认可为聚焦索引。该索引只好在剔除与它保持联系的表或主键约束时技巧去除。

 

 

②FOREIGN KEY约束

 

标志表之间的涉及,用于强制参照完整性,为表中一列或多列提供参谋完整性。 FOREIGN KEY约束也得以参照本人表中的其余列(举例:学生表中的“班长学号”列参照“学号”列),这种参照称为自参照。

 

FOREIGN KEY约束能够在上边情况下行使:

 

(1)作为表定义的一有的在创建表时成立。

(2)借使现有表的某列与另多个表已有的P凯雷德IMA冠道Y KEY约束或UNIQUE约束相关联,则可向现成表增添FOREIGN KEY约束。

(3)对已部分FOREIGN KEY约束举办退换或删除。

 

应用FOREIGN KEY约束,应留心的多少个难题:

 

(1)种种表最多能够有251个FOREIGN KEY约束。

(2)FOREIGN KEY约束只可以参照同三个数据库中的表,而无法参照其余数据库中的表。

(3)FOREIGN KEY子句中的列数目和每一种列钦命的数据类型必得和REFERENCES子句中的列一样。

(4)FOREIGN KEY约束不能够自动创造索引。

(5)在不经常表中,不能够接纳FOREIGN KEY约束。

(6)若是一个外键未有对应的主键值,则无法插入带该值的行。

 

 

③UNIQUE约束 

 

(1)UNIQUE约束在列集内强制推行值的独一性。

(2)对于UNIQUE约束中的列,表中不一样意有两行富含一样的非空值。

(3)SQL Server创制了UNIQUE约束后会自动创立UNIQUE索引来强制UNIQUE约束的独一性供给。

(4)假使插入重复行,SQL Server将赶回错误音讯。

(5)向表中的水保列增添UNIQUE约束时,暗中认可景况下SQL Server 二零零六检查列中的现存数量确认保证除NULL外的具备值均独一。

(6)UNIQUE约束与主键约束的界别: 主键也强制施行独一性,但主键差别意空值,何况每种表中主键只可以有三个,但UNIQUE列能够有多少个,能够取空值。

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

 

 

④CHECK约束

 

(1)CHECK约束通过限制客户输入的值来坚实域完整性。

(2)它钦赐应用于列中输入的全体值的布尔(取值为TRUE或FALSE)搜索条件,拒绝全数不取值为TRUE的值。

(3)可感觉每列钦命多个CHECK约束。

 

⑤IDENTITY约束 

 

活动编号约束又称作标记列,接纳数字编号的办法挨个扩充贰个增量。是为那么些数字顺序递增的列筹算的束缚,能够活动达成数值增添。

 

(1)标记种子

(2)标志增量

(3)标识列的数据类型

 

 

四、完整性约束命名子句

 

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

CONSTRAINT <完整性约束规范名>[PRIMARY KEY短语|FOREIGN KEY 短语|CHECK短语]

 

例:建设构造学生登记表Student2,需求学号在一千0至99999中间,姓名不能够取空值,年龄小于30,性别‘男’或‘女’:

1 CREATE TABLE Student2(
2        sno   int CONSTRAINT C1 CHECK (sno BETWEEN 10000 AND 99999),
3        sname  CHAR(8)  CONSTRAINT C2 NOT NULL,
4        sage  int  CONSTRAINT C3  CHECK (sage<30),
5        ssex   VARCHAR(2)  CONSTRAINT C4 CHECK (ssex IN ('男', '女')),
6        CONSTRAINT SK PRIMARY KEY(Sno)
7 );    

 

本文由9159.com发布于www.9159.com,转载请注明出处:在创建表时创建Primary Key,  1、实体约束

关键词: www.9159.com 9159.com