金沙糖果派对网站app 18

约束

金沙糖果派对网站app 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、对约束的命名(允许今后直接访谈约束卡塔尔(英语:State of Qatar)

  4、限制的品类(主键限制卡塔尔

  5、约束应用于哪个列。

  3、复合主键的创导

  假如实在Management
Studio中,创制复合主键,只须要按住Ctrl键,选中五个列,然后设置为主键就OK了,特别轻巧。上面重要描述使用T-SQL创设复合主键的议程:

ALTER TABLE 表名 WITH NOCHECK ADD 
CONSTRAINT [PK_表名] PRIMARY KEY NONCLUSTERED 
( 
[字段名1], 
[字段名2] 
) 

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

金沙糖果派对网站app 2😉

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

金沙糖果派对网站app 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。

  外键和主键不相像,每种表中的外键数目不节制唯后生可畏性。在种种表中,每朝气蓬勃有-~255个外键。唯生龙活虎的节制是三个列只好引用一个外键。贰个列能够被多少个外键引用。

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

金沙糖果派对网站app 4😉

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

金沙糖果派对网站app 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二零零五中引进的,如若要合作到SQLServer2001的话,要防止选拔这八个级联合浮动作。可是他们的才做是特别轻松的:若是推行更新而改动了三个父行的值,那么子行的值将被设置为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”卡塔尔(英语:State of Qatar),恐怕有个别系统值(getdate(卡塔尔国卡塔尔(قطر‎。

  对于DEFAULT限定,要询问以下多少个天性:

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

  2、即使在insert语句中提供了任性值,那就不使用暗中认可值。

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

  值得注意的是,update命令的规行矩步由一个不等,借使展现表明使用暗中同意值正是区别。能够经过利用主要字DEFAULT表示更新的值设置为暗中同意值。

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

金沙糖果派对网站app 6😉

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

金沙糖果派对网站app 7😉

  在实践语句后:

insert into person (person_age) values(24)

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

  金沙糖果派对网站app 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约束,而与此同期保险约束的完整性。

   禁止使用二个数据完整性准则平时是因为已经有不行数据了。那样的多少平常分为以下两类:

金沙糖果派对网站app,  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奥迪Q3语句,那样就可以撤除需求的节制。

  先来拜访上节中创立的那些约束:

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

  金沙糖果派对网站app 9

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

  当要启用节制时,只须求用将语句中的NO CHECK替换为CHECK就能够了:

Alter Table Account
    CHECK
    constraint CN_AccountAge18

   实践之后,限定又启用了:再来sp_helpconstraint看下:

  金沙糖果派对网站app 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卡塔尔(英语:State of Qatar)。

  消除绑定准绳:

  当大家须求在多个列上消弭绑定法规的时候,只要实行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卡塔尔(英语:State of Qatar)都无法取空值(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卡塔尔(英语:State of Qatar)、有个别非主属性不能取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是否有默认值为当前日期

查询结果如下
金沙糖果派对网站app 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

查询结果如下
金沙糖果派对网站app 12

  ->数据完整性具体实现包涵两类

3.爽约管理

储存进程查询默许值对象的全体者
USE test
EXEC sp_help date_today;
GO

结果如图所示
金沙糖果派对网站app 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';

当时再次删除暗中认可值对象,就可以成功删除。删除默许值对象后,原先绑定的字段不会再有暗许值。

           金沙糖果派对网站app 14

金沙糖果派对网站app 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 行
在应接受规范的上下文(在’;’ 周边卡塔尔(英语:State of Qatar)中钦赐了非布尔类型的表明式。

                 金沙糖果派对网站app 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';

结果如图所示
金沙糖果派对网站app 17

-》》》完整性再演讲

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

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

结果如图所示
金沙糖果派对网站app 18

     数据颇有复杂的数据类型,用来满意分化的需要。实际运用中的数据也持有必然的取值范围,如年龄相当大于0,性别只有男女等。而表之间的交流使相连的字段要保持意气风发致和完全。但是,实操不或然确定保障插入和删除的数量都相符必要,不切合须求的操作极或然会损坏数据的完整性,对数据库的可相信性和周转技艺变成威吓。

 

故此贮存数据集的数据库必须要对数据表和列有所节制和正规,为此SQLServer系统使用豆蔻梢头层层的秘诀来保卫安全数据完整性。

缺省和准则来源于由Sybase开垦的S私下认可值QL
Server,在老版本的SQL Server只怕升级版本中都有缺省和准绳的选用。

多少的完整性:数据的完整性是指数据库中数量的不错和后生可畏致性,表内的数目不相冲突,表间的数码不相矛盾,关联性不被破坏。

缺省是为列提供数据的后生可畏种艺术,假如客商实行INSERT操作时不为列输入数据,则应用缺省值。

为此有了以下实践完整性的不二等秘书诀:

准则是当客商举行INSERT或uPDATE操作时,对输入列中的数据设定的取值范围,是促成域完整性的方式之风流浪漫。

1.        对列数据的调节:数据申明约束、暗许值约束、法规。

 

2.        对列的主宰:主键节制、唯后生可畏性限制、标志列。

缺省与法规有以下特点:

3.        对表之间、列之间关系的操纵:外键约束、数有趣的事明节制、触发器、存款和储蓄进度。

(1卡塔尔(قطر‎缺省与准则是数据库对象,它们是独自于表和列而树立的。

这个门路得以依照系列分为:约束、准则、暗中认可值、触发器、存款和储蓄进度。

(2卡塔尔(英语:State of Qatar)缺省与法则创建后与列或数据类型发生关联,列和数据类型就具备了缺省与法则的性质。

自律分为以下几点:

(3卡塔尔(قطر‎缺省与准则定义后,能够重复使用,能够绑定到多少个列或数据类型上。

l        主键约束

(4卡塔尔(英语:State of Qatar)缺省与法则不随表同期调入内部存款和储蓄器,当用届期才被调入内部存储器,那或者会使程序实行现身延时。

主键:P帕杰罗IMA中华VY
KEY,主关键字,用来界定列的数额具备唯生机勃勃性且不为空,即这一字段的多寡还没重新的多寡值且不可能有空值。各类表只可以有多个主键,日常用来做标志。

 

l        外键约束

缺省和准绳对象平时只在它所创设的数据库中有效,不是ANSI规范,平日不提倡使用。

外键:FOREIGN
KEY,外键用来在七个表的数据里面确立连接,它能够是一列恐怕多列。贰个表能够有二个依然七个外键。外键对应的是参照他事他说加以考察完整性,多少个表的外键可以为空值,若不为空值则每叁个外键值必需等于另贰个表中主键的某些值。

应尽恐怕使用限定,任何能够应用缺省与法规的地点都有可以利用约束。

l        标识列

 

能够活动编号的列称为标志列或IDENTITY限定。IDENTITY约束正是为那多少个数值顺序依次增加的列计划的约束,自动完毕数值的丰富。每一种表只可以有叁个标记列,标记数据不可能由顾客输入,顾客只需求填写标识种子(标志列的率先个数据卡塔尔(英语:State of Qatar)和标记增量(依次增加的数卡塔尔,系统自动生成多少并填入表。标识种子和标记增量都是非零整数,位数稍低于等于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约束,它经过给定条件(逻辑表明式卡塔尔(英语:State of Qatar)来检查输入数据是或不是相符要求,以此来维护数据完整性。

 

l        暗中同意值约束

②利用CREATE
DEFAULT语句创设默许对象后,使用存储进程sp_bindefault将该默许对象绑定到列上。

又称作DEFAULT节制。将常用的多寡值性以为暗中认可值能够节约客商输入的时日,在非空字段中定义暗中认可值能够减去不当产生。在其实使用中,暗许值还足以是结果能变的函数。

 

 

私下认可值对象是单身存款和储蓄的,删除表的时候,DEFAULT约束会自动删除,但是暗中认可值对象不会被剔除。

规则:

创办暗许值对象后,须求将其绑定到某列或然顾客自定义的数据类型上。

admin

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注