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

作者: 网络时代  发布:2019-08-05
积累进度查询暗中认可值对象的全体者
USE test
EXEC sp_help date_today;
GO

结果如图所示
图片 1

-》》》完整性再解说

比如要刨除准则,应鲜明准绳已经排除绑定。

8、触发器

  触发器也能够用于落实数据完整性,这些剧情相当多,新建一篇文章陈说。

主关键字约束(Primary Key Constraint)

用来内定表中的一列或几列组合的值在表中兼有独一性。创建主键的目标是让外键来引用。

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

 

9、怎么样抉择

  经过以上的学习,对于数据完整性,你会意识有很各个方可挑选,那么怎么着选择合适的自律呢?

限制 优点 缺点
约束

快速

可以引用其他列

在命令执行前发生

遵循ANSI标准

必须对每个表重新定义

不能引用其他表

不能绑定到数据类型

规则

独立的对象

可重用

可以绑定到数据类型

命令执行前发生

稍慢

不能跨列使用

不能引用其他表

实际上只用于向后兼容

默认值

非常灵活

可以引用其他列或其他表

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

在命令执行之后发生

系统开销很大

  假如要完成更健康的逻辑模型以及宽广应用用户自定义数据类型,则相似选择准则和暗中同意值。在这种气象下法规和暗许值可以提供成千上万职能,轻易管理,而不用太多的编制程序开支。

  独有在无法接纳约束时行使触发器。和束缚同样,他们被增大到表中,而且必须对创立的种种表重新定义。好的方面是触发器大约能够做数据完整性方面包车型地铁另外操作。实际上再未有出现外键时,他们常被用作外键的庖代品。

  而在任何情形下,应将封锁作为数据完整性消除方案的选拔。它们推行进程快,并且轻易成立。他们的缺点是成效有限(除了外键约束,都无法援用其余表),何况对于通用约束逻辑来讲,供给一回次地再一次定义。

增多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;

CREATE VIEW

  用SQL Server Management Studio创造表时在统一策画表时钦点暗许值,能够在输入字段名称后,设定该字段的暗许值。

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的选项来运行ALTEEnclave语句,那样就可见裁撤须求的自律。

  先来探视上节中创制的那一个约束:

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

  图片 2

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

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

Alter Table Account
    CHECK
    constraint CN_AccountAge18

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

  图片 3

   留意到status_enabled列产生了Enabled。

  status_enabled的三种状态如下:

  Enabled:启用;

  Disabled:禁用;

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

The GRANT & REVOKE statements

例如: exec sp_unbindefault ‘sc.grade' 

5、DEFAULT约束

  和富有约束同样,DEFAULT约束也是表定义的一个组成都部队分,它定义了当插入的新行对于定义了暗中认可约束的列未提供对应数额时该怎么做。能够定义它为一个字面值(比如,设置暗许薪酬为0,也许设置字符串列为"UNKNOWN"),也许某些系统值(getdate())。

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

  1、暗中同意值只在insert语句中运用-在update语句和delete语句中被忽视。

  2、假设在insert语句中提供了任性值,那就不使用默许值。

  3、若无提供值,那么总是利用默许值。

  值得注意的是,update命令的平整由二个两样,假如展现表达使用私下认可值正是分化。能够因此运用重要字DEFAULT表示更新的值设置为暗许值。

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

图片 4;)

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

图片 5;)

  在推行语句后:

insert into person (person_age) values(24)

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

  图片 6

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

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

由此定义列的暗中认可值或行使数据库的暗中同意值对象绑定表列,来钦定列的暗中认可值。

    ->注脚性数据完全性 :评释性数据全体性用约束(Constraint)、法规(Rule) 在数据库中提供保证,那是保证完整性的较好形式。它驻留在数据库内,编程轻巧,费用小,能更聚集管理和保障数据的一致性

 

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提供了依靠于您所查询对象的享有指标列表。

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

结果如图所示
图片 7

                 

 

一、约束的归类

  在SQLServer中,有3种不一样类其余羁绊。

  1、实体约束

    实体约束是有关行的,举个例子某一行出现的值就不容许出今后任何行,比如主键。

  2、域约束

    域约束是关于列的,对于持有行,某一列有那多少个约束,比方CHECK约束。

  3、参照完整性约束

    要是某列的值必须与其余列的值卓殊,那就意味着须要一个参照完整性约束,举例外键。

UNIQUE约束

除主键外另一种能够定义独一约束的类型,允许空值。增添UNIQUE的点子同上,这里只简单比方。

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

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

(2)缺省与准绳创立后与列或数据类型发生关联,列和数据类型就具备了缺省与法则的习性。

SQLServer - 约束

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

Security

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

2、外键约束

  外键不只能确认保障数据完整性,也能显现表之间的关系。加多了外键之后,插入引用表的笔录要么必须被引用表中被引述列的某条记下相称,要么外键列的值必须设置为NULL。

  外键和主键不雷同,每一个表中的外键数目不限制独一性。在每种表中,每一有-~254个外键。独一的限定是三个列只可以援用七个外键。一个列能够被三个外键引用。

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

图片 8;)

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

图片 9;)

  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。后八个是在SQLServer2006中引入的,若是要合作到SQLServer两千的话,要防止接纳那四个级联合浮动作。然则她们的才做是特别轻易的:若是进行更新而改换了一个父行的值,那么子行的值将被安装为NULL,可能设置为该列的私下认可值(不管SET NULL依然SET DEFAULT)。

  4、外键其他方面的设想

    外键中的之唯有入选也许的挑选:

    1、在列中填充与被援引表中的应和列相相称的值。

      通过定义引用列为NOT NULL,能够使外键完全部是必须的(即用户拉长数据时必须引用表中务必有相匹配的一条龙数据)。

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

      允许援引列有NULL值时,用户能够采用不提供值-纵然在被引用表未有与NULL值相称的行,照旧允许插入。

CHECK约束

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

触发器的介绍

 

  1. 1

    触发器(trigger)是个独具匠心的存放进度,它的实施不是由程序调用,亦不是手工运行,而是由事件来触发,当对一个表打开操作( insert,delete, update)时就能激活它实践,触发器平日用来狠抓数据的完整性约束和事务准绳等。其实往轻便了说,就是触发器就是三个开关,负担灯的亮与灭,你动了,它就亮了,就以此意思。

    图片 10

    END

(6)借使二个外键未有对号入座的主键值,则不可能插入带该值的行。

二、约束命名

  在就学约束在此之前,首先来了然下为约束命名要求留神哪些地点。

  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;

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

规则:

(2)标志增量

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'。
语句已终止。
翻看自定义法则的定义新闻
EXEC sp_helptext 'score_rule';
GO

结果如图所示
图片 11

from Database Design to Physical Form

(4)成立表时钦命主键,sql server会自动创立三个名字为“PK_”且后跟表名的主键索引。若是不内定索引类型,则默感到集中索引。该索引只好在剔除与它保持联系的表或主键约束时本领去除。

三、键约束

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

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

condition_expression  是概念准绳的规格。

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关键字並且当前表中还从未聚焦索引。
  •     每一个表中只好有叁个主键,但足以由多少个独一约束。
累加封锁内定约束名
ALTER TABLE table3
ADD CONSTRAINT df_t3_type
DEFAULT '类型2' FOR t3_type;
GO

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

 

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

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

图片 12;)

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

图片 13;)

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

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

 

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

平整是对列或自定义数据类型的值的规定和界定。自定义准则的表明式必定要回来布尔类型的值,並且表明式中不能够包括七个变量。

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 行
在应选用条件的上下文(在';' 周围)中钦命了非布尔类型的表明式。

l        主键约束

 

NOT NULL约束

自律字段值不为空。

       图片 14

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

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

       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.

学生的学号一定是独占鳌头的;

约束

2.        对列的决定:主键约束、独一性约束、标记列。

①创立暗中同意值对象

增添封锁不点名约束名
ALTER TABLE table3
ADD DEFAULT '类型2' FOR t3_type;
GO

贰个列是或不是允许有空值,正是此处的空和非空约束,即NULL与NOT NULL约束。NULL正是同意为空,NOT NULL正是分裂意为空。NULL分化于0和“”,0和“”都意味为该行有多少,而NULL是未曾数据。

 

外关键字约束(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走,不能够反着来。

丰盛和删除了这一个之外键约束同主键。

     数据颇具复杂的数据类型,用来知足不一致的急需。实际运用中的数据也不无一定的取值范围,如年龄十分的大于0,性别独有男女等。而表之间的牵连使相连的字段要保持一致和总体。但是,实操不可能担保插入和删除的数据都符合须求,不符合要求的操作极大概会破坏数据的完整性,对数据库的可相信性和平运动转技艺形成要挟。

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

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

  ->数据完整性类型包涵:实体完整性、参照完整性和用户定义完整性  

 

除去私下认可值对象
DROP DEFAULT date_today;

剔除不成功,提醒以下新闻:
消息3716,级别16,状态3,第1 行
不能删除私下认可值'date_today',因为它已绑定到贰个或八个列。
那么大家领略,当三个默许值对象绑定了列之后,就不能够删除它,借使想要删除,就必须先解绑。在上边的操作中,大家的默许值对象date_today绑定了test数据库table3表的t3_date1字段。

那么些路子得以依照类别分为:约束、准绳、暗许值、触发器、存款和储蓄进程。

 

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。

           图片 15

DROP DEFAULT {default} [,…n]

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

l        外键约束

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

自定义暗中认可值对象有限帮衬数据完整性

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

询问结果如下
图片 16

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

查询结果如下
图片 17

  ->数据完整性具体贯彻包涵两类

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

剔除自定义法则

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

5)       法规创制一次能够行使频仍而CHECK约束要求频仍创办。

例如:drop rule r_grade 

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

这儿大家重新尝试删除私下认可值对象,发掘依旧极其,此时要留神,在地点的操作中,暗许值对象date_today不唯有绑定了t3_date1列,还绑定了自定义数据类型date_time,并将该数据类型定义给了t3_date列,大家还供给对date_time解绑暗中认可值对象。

EXEC sp_unbindefault 'date_time';

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

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

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

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

Go

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

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

与创设法规平等,暗中认可值的概念不可能包含列名,须要绑定到列或是别的数据库对象技艺应用。三个列只可以绑定二个暗许值

(3)要是已有PSportageIMA奥迪Q5Y KEY约束,则可对其张开改换或删除。

在创制表的时候增加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'。
讲话已告一段落。

 

 

默认值:

 

       CHECK

 

USE 数据库名

在SQL Server中,有两种采纳暗中同意值的主意:

1.        对列数据的决定:数据证实约束、默许值约束、法则。

(2)加多到尚未有P福特ExplorerIMAWranglerY KEY约束的表中(八个表只好有贰个P凯雷德IMATucsonY KEY约束)。

AS 常亮表明式

学生所在的系必须是这个学院设置的系;

                    触发器

 

CREATE TABLE

假诺列中满含CHECK约束,则CHECK约束优先。

       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.

(5)在有时表中,不能够使用FOREIGN KEY约束。

又称做CHECK约束,它通过给定条件(逻辑表明式)来检查输入数据是或不是符合供给,以此来保卫安全数据完整性。

②绑定暗中认可值对象

l        数据证实约束

(3)要运用TRansact-SQL修改P景逸SUVIMA奔驰M级Y KEY,必须先删除现存的P安德拉IMAGL450Y KEY约束,然后再重新创立。

又叫UNIQUE约束,在主键约束中也选取了独一性,区别的是四个表中可以有几个如此的不今不古性列,却不得不有叁个主键。这里的当世无双性列可感觉空可是不得不有一行数据为空。适用于不是主键但却依然须要有所独一性的字段。

rulename  是新法则的称呼。

主键:PCRUISERIMAQashqaiY KEY,主关键字,用来限制列的多寡有所独一性且不为空,即这一字段的数量未有重新的数目值且不能够有空值。各类表只好有一个主键,一般用来做标志。

DBMS若觉察用户的操作违背了完整性约束标准,就利用一定的动作以保障数据的完整性,如拒绝执行该操作,或级联执行别的操作。

为此有了以下实践完整性的路线:

 

DML触发器介绍

 

  1. 1

    在SQL SE路虎极光VE卡宴二零零六中,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

学生的年纪必须是整数,取值范围为14-29;

Integrity(完整性)

④查看默许对象

    ->用户定义的完整性(User_defined Integrity ):针对某一切实可行数量的自律标准,由应用境况决定。比如:有个别属性具备缺省值、某些属性必须取惟一值(UNIQUE)、有些非主属性无法取NULL值、有些属性的取值范围在0~100之间(CHECK)等等。

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

在此处的口径表达式使用逻辑表达式,表明式中要有二个@先河的变量,代表用户的输入数据,能够当做是代表WHERE后边的列名。

1.数据库的完整性:

Introduction

 

规范表明式

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

自律分为以下几点:

 

    ->进度性数据全部性 :进度性数据完整性用触发器和应用程序代码保险,日常相比复杂、开支十分大,但能够实践越多的业务法规。 日常,进度性数据完整性是注解性数据完整性的补给

exec sp_unbindrule 'sc.grade' 

法规的性格(与CHECK的例外)

 

Definition 7.1.2 Column Constraint

 

始建法规

3.爽约处理

本文由巴黎人游戏官网发布于网络时代,转载请注明出处:在创建表时创建Primary Key,  1、实体约束

关键词: