zoukankan      html  css  js  c++  java
  • 约束4:唯一约束,Check约束和null

    大家知道,关系型数据库的逻辑运算的结果是三值型的,TRUE,FALSE和UNKNOWN,特别是,NULL值和任何值都不相等,任何值和NULL的比较,返回的逻辑结果都是unknown。而NULL值在唯一约束和Check约束中的表现,不同于NULL值的定义。

    唯一(Unique)约束在内部使用唯一索引来保证列值的唯一性。在一个列上创建唯一约束(unique)之后,该列允许插入null值,通常情况下,两个null值是不相等的,但是在唯一约束中,unique约束把两个null值看作是相同的,也就是说,null和null是相等的,null和其他任何非null值都不相等。

    Check约束用以限制单列的可能取值范围,在check约束中(check(expression)),如果expression返回的结果是Unknown,那么check约束返回的结果是true。这就意味着,如果expression的值是null,那么该表达式的值满足check约束。

    一,唯一约束

    唯一约束可以创建在列级别上,也可以在表级别上。在列级别上, default 约束定义的语法是:分为column level和table level,区别在于Table Level需要制定unique约束影响的column(or columns)。

    列级别定义的唯一约束的语法是:

    column_name <data_type>[ CONSTRAINT constraint_name ] UNIQUE 

    表级别定义的唯一约束的语法是:

    [ CONSTRAINT constraint_name ] UNIQUE(column [ ASC | DESC ] [ ,...n ] )

     二,向现有表上增加唯一约束

    1,增加unique约束

    alter table dbo.dt_test_unique
    add constraint uq_test_id unique nonclustered(id)

    2,删除unique约束

    alter table dbo.dt_test_unique
    drop constraint uq_test_id

    3,修改unique约束

    不能在现存的表上修改unique约束,变通的方法是先删除 unique约束,后增加一个新的unique约束

    alter table dbo.dt_test_unique
    drop constraint uq_test_id
    
    alter table dbo.dt_test_unique
    add constraint uq_test_id unique nonclustered(id)

    三,Check约束

    Check约束用以限制单列的可能取值范围,需要在Check约束中指定逻辑表达式,该逻辑表达式必须返回逻辑值(TRUE或FALSE),在Check中,把UNKNOWN值认为是TRUE。

    check(expression)

    1,在check约束中

    如果expression返回的结果是Unknown,那么check返回的结果是true。

    create table dbo.dt_check
    (
        id int null constraint ck_ID_is_Positive check(id>0)
    )

    插入数据,测试check约束的工作机制

    insert into dbo.dt_check
    values(null)
    insert into dbo.dt_check
    values(1)
    insert into dbo.dt_check
    values(0)

    INSERT 语句与 CHECK 约束"ck_ID_is_Positive"冲突。该冲突发生于数据库"db_study",表"dbo.dt_check", column 'id'。

    语句已终止。

    NULL和1 插入成功,而0插入失败。

    2,在表级别上定义Check约束

    在表级别上定义Check约束,可以对多列的可能取值进行限制

    create table dbo.dt_check
    (
        id int null ,
        code int null,
        constraint ck_IDCode_is_Positive check(id>0 and code >0)
    )

    在一个已经创建的table上,通过alter table命令来增加、修改和删除check约束,添加的约束是表级别的约束

    3,增加check约束

    alter table dbo.dt_check
    add constraint ck_ID_is_Positive check(id>0)

    4,删除check约束

    alter table dbo.dt_check
    drop constraint ck_ID_is_Positive

    5,修改Check约束

    没法直接修改Check约束,变通方法是:必须先删除约束,然后添加新的check约束

    alter table dbo.dt_check
    drop constraint ck_ID_is_Positive
    
    alter table dbo.dt_check
    add constraint ck_ID_is_Positive check(id>0)

    6,通过alter table命令增加新的列,并在列级别上创建check 约束

    alter table dbo.dt_check
    add  sex char(1) not null
    constraint ck_sex check(sex in('M','F'))

    参考文档:

    SQLServer - 约束

    SQL Server中约束的介绍

    table_constraint (Transact-SQL)

  • 相关阅读:
    SQL逻辑查询处理阶段
    将json字符串转换为json兑现
    JSTL核心标签库
    eclipse用4个空格代替Tab 每行80字符限制提示线显示空格
    MyEclipse8.6 性能优化
    jsp/servlet总结复习
    SQLServer之MERGE INTO
    as3效率提升
    让默认TextField更清晰地显示中文
    as3垃圾回收机制
  • 原文地址:https://www.cnblogs.com/ljhdo/p/4984349.html
Copyright © 2011-2022 走看看