您的位置:1010cc时时彩经典版 > 1010cc安卓版 > 1010cc时时彩经典版的约束条件,2008从入门到精通

1010cc时时彩经典版的约束条件,2008从入门到精通

发布时间:2019-11-01 04:10编辑:1010cc安卓版浏览(178)

    约束

    1010cc时时彩经典版 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] 
    ) 
    

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

    1010cc时时彩经典版 2;)

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

    1010cc时时彩经典版 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、创造表的时候成立外键

    1010cc时时彩经典版 4;)

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

    1010cc时时彩经典版 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二〇〇七中引入的,假设要同盟到SQLServer二〇〇四的话,要制止采纳那三个级联合浮动作。不过她们的才做是特别轻巧的:要是施行更新而改正了二个父行的值,那么子行的值将被安装为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约束:

    1010cc时时彩经典版 6;)

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

    1010cc时时彩经典版 7;)

      在举行语句后:

    insert into person (person_age) values(24)
    

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

      1010cc时时彩经典版 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的选项来运维ALTERAV4语句,那样就可以看到撤消需求的牢笼。

      先来拜会上节中开创的那个约束:

    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
    

      1010cc时时彩经典版 9

       留意到status_enabled名列Disabled表达是禁止使用的意味。

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

    Alter Table Account
        CHECK
        constraint CN_AccountAge18
    

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

      1010cc时时彩经典版 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是否有默认值为当前日期
    

    询问结果如下
    1010cc时时彩经典版 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
    

    询问结果如下
    1010cc时时彩经典版 12

      ->数据完整性具体完结满含两类

    3.违背左券管理

    储存进程查询暗中同意值对象的持有者
    USE test
    EXEC sp_help date_today;
    GO
    

    结果如图所示
    1010cc时时彩经典版 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';
    

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

               1010cc时时彩经典版 14

    1010cc时时彩经典版 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 行
    在应使用条件的上下文(在';' 周围)中内定了非布尔类型的表达式。

                     1010cc时时彩经典版 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';
    

    结果如图所示
    1010cc时时彩经典版 17

    -》》》完整性再演讲

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

    翻看自定义准绳的定义音讯
    EXEC sp_helptext 'score_rule';
    GO
    

    结果如图所示
    1010cc时时彩经典版 18

         数据颇有千丝万缕的数据类型,用来满意不一致的急需。实际运用中的数据也持有必然的取值范围,如年龄非常大于0,性别独有儿女等。而表之间的联络使相连的字段要保持后生可畏致和完全。但是,实操不可能确认保障插入和删除的数目都适合需要,不适合必要的操作极恐怕会损坏数据的完整性,对数据库的可相信性和平运动行本领形成勒迫。

     

    故而存放数据集的数据库必供给对数据表和列有所限定和正规,为此SQLServer系统使用风流潇洒层层的章程来维护数据完整性。

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

    数量的完整性:数据的完整性是指数据库中数据的不错和生机勃勃致性,表内的数码不相矛盾,表间的数码不相冲突,关联性不被毁坏。

    缺省是为列提供数据的豆蔻年华种情势,假设客户张开INSERT操作时不为列输入数据,则应用缺省值。

    为此有了以下履行完整性的渠道:

    平整是当客商张开INSERT或uPDATE操作时,对输入列中的数据设定的取值范围,是贯彻域完整性的情势之意气风发。

    1.        对列数据的主宰:数据证实约束、暗中同意值限定、准则。

     

    2.        对列的决定:主键节制、唯生机勃勃性约束、标记列。

    缺省与准绳有以下特征:

    3.        对表之间、列之间关系的主宰:外键限定、数据注解约束、触发器、存款和储蓄进度。

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

    那几个门路得以坚决守护系列分为:限制、准绳、暗中同意值、触发器、存款和储蓄进程。

    (2)缺省与法则建构后与列或数据类型产生关联,列和数据类型就全数了缺省与准绳的性子。

    封锁分为以下几点:

    (3)缺省与法规定义后,能够重复使用,能够绑定到四个列或数据类型上。

    l        主键约束

    (4)缺省与准绳不随表同有时候调入内存,当用到时才被调入内部存款和储蓄器,那也许会使程序实践现身延时。

    主键:PEscortIMA大切诺基Y 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限定会自动删除,可是暗中同意值对象不会被剔除。

    规则:

    制造暗中同意值对象后,须求将其绑定到某列或许顾客自定义的数据类型上。

    本文由1010cc时时彩经典版发布于1010cc安卓版,转载请注明出处:1010cc时时彩经典版的约束条件,2008从入门到精通

    关键词: