zoukankan      html  css  js  c++  java
  • Sql Server系列:键和约束

    1 约束的类型

      约束可以分为3大类:实体约束、域约束和参照完整性约束。

    1.1 实体约束

      实体约束都是关于比较行的,实体约束并不关心整体列中的数据,它只对特定行感兴趣。

    1.2 域约束

      域约束处理一个或多个列,确保一个特定列或一组特定列满足特地的标准。在插入或更新一行时,域约束不考虑其他行。如限定UnitPrice列的值大于或等于0,这就是域约束。

    1.3 参照完整性约束

      如果某列的值必须与其他列(该列可能在同一个表中,或者更通常的是在不同的表中)的值匹配,这就意味着创建了参照完整性约束。

    2 键约束

      常用的键约束包括:主键约束、外键约束和唯一约束(也叫替换键约束)。一个表只能有一个主键约束,可以有多个外键约束和多个唯一约束。

    2.1 主键约束

      主键是每行的唯一标识符,必须包含唯一的值,不能为NULL。一个表可以有多个主键,当然也允许表中不设主键。

      主键约束命名的可参考规则:PK_[table_name]

    ALTER TABLE dbo.[Product] ADD CONSTRAINT PK_Product PRIMARY KEY ([ProductID])

      一般情况下主键还会同时创建聚集索引:

    ALTER TABLE dbo.[Product] ADD CONSTRAINT PK_Product PRIMARY KEY CLUSTERED ([ProductID])

    2.2 外键约束

      外键能确保数据完整性,也能表现表之间的关系。添加外键之后,插入引用表的记录要么必须与被引用的表列中的某条记录匹配,要么外键列的值设置为NULL。

      外键约束命名的可参考规则:FK_<foreign_key_table_name>_<primary_key_table_name>

      若外键表中存在多个外键字段对同一个主键表的引用,则外键约束的命名可参考规则:

      FK_<foreign_key_table_name>_<primary_key_table_name>_<colunm_name>

    ALTER TABLE dbo.Product ADD CONSTRAINT
        FK_Product_Category FOREIGN KEY
        (
            CategoryID
        )
        REFERENCES dbo.Category
        (
           CategoryID
        )
        ON DELETE  CASCADE

    2.3 唯一约束

      唯一约束要求在表中指定的列上有一个唯一值,一个表可以有多个唯一约束。

      唯一约束可参考的命名规则:UQ_<table_name>_<column_name>

    ALTER TABLE dbo.[Product] ADD CONSTRAINT UQ_Product_BarCode UNIQUE ([BarCode])

    3 域约束

    3.1 CHECK约束

      CHECK约束不限于一个特定的列,CHECK约束可以和一个列关联,也可以和表关联。可以检查一个列的值相对于另外一个列的值。CHECK约束可以用于检查列值组合是否满足条件。

      CHECK约束可参考命名规则:CK_<table_name>_<column_name>

    ALTER TABLE dbo.[Product] ADD CONSTRAINT CK_Product_UnitPrice CHECK ([UnitPrice] >= 0)
    ALTER TABLE dbo.[Product] ADD CONSTRAINT CK_Product_UnitPrice CHECK ([BeginDate] > [EndDate])

    3.2 DEFAULT约束

      DEFAULT约束定义了当插入新的记录时为未提供相应数据的列设置默认值,默认值只在INSERT时起作用。

      DEFAULT约束可参考命名规则:DF_<table_name>_<column_name>

    ALTER TABLE dbo.[Product] ADD CONSTRAINT DF_Product_CreateDate DEFAULT GETDATE() FOR [CreateDate]

    4 禁用约束

      有时会希望暂时或永久的消除约束,禁用一个数据完整性规则通常是因为已经有无效数据,这样的数据通常分为两类:在创建约束时已经存在的数据和在约束创建以后希望添加的数据。

      不能禁用主键约束或者唯一约束。

    4.1 在创建约束时忽略无效的数据

      要添加一个约束,但又不将其应用到已存在的数据中,可以在执行ALTER TABLE语句添加约束时使用WITH NOCHECK选项。

    ALTER TABLE dbo.[Product] WITH NOCHECK
    ADD CONSTRAINT CK_Product_UnitPrice CHECK ([UnitPrice] > 0)

    4.2 临时禁用已存在的约束

      在ALTER语句中使用NOCHECK选项可以临时取消需要处理的约束。

    ALTER TABLE dbo.[Product] NOCHECK CONSTRAINT CK_Product_UnitPrice

      重新恢复约束

    ALTER TABLE dbo.[Product] CHECK CONSTRAINT CK_Product_UnitPrice

      禁用全部约束

    ALTER TABLE [dbo].[Product] NOCHECK CONSTRAINT ALL

      启用全部约束

    ALTER TABLE [dbo].[Product] CHECK CONSTRAINT ALL

    5 删除约束

    ALTER TABLE dbo.[Product] DROP CONSTRAINT CK_Product_UnitPrice

    6 查看表中全部约束

    EXEC sp_helpconstraint Product

    7 规则

      规则与CHECK类似,它们之间的区别是规则每次只能作用于一个列,而CHECK约束可以作用于多个列,如BeginDate > EndDate。可以将同一个规则分别绑定到一个表中的多个列,规则分别作用于每个列,不会意识到其他列的存在。

    7.1 创建规则

      创建规则语法

    CREATE RULE [ schema_name . ] rule_name 
    AS condition_expression
    [ ; ]

      condition_expression 包括一个变量。 每个局部变量的前面都有一个@符号,在创建规则时可以使用任何名称或符号表示值。

      为特定列创建规则

    CREATE RULE RU_UnitPrice
    AS
        @UnitPrice > 0

      创建具有范围的规则

    CREATE RULE RU_Range
    AS
        @Value > 0 AND @Value < 100

    7.2 查看规则定义

    EXEC sp_helptext RU_Range

    7.3 绑定规则

    sp_bindrule [ @rulename = ] 'rule' , 
         [ @objname = ] 'object_name' 
         [ , [ @futureonly = ] 'futureonly_flag' ] 
    EXEC sp_bindrule 'RU_UnitPrice','[Product].[UnitPrice]'

    7.4 取消规则

    sp_unbindrule [ @objname = ] 'object_name' 
         [ , [ @futureonly = ] 'futureonly_flag' ]
    EXEC sp_unbindrule '[Product].[UnitPrice]'

    7.5 删除规则

    DROP RULE { [ schema_name . ] rule_name } [ ,...n ] [ ; ]
    DROP RULE RU_UnitPrice

    8. 默认值

    8.1 创建默认值

    CREATE DEFAULT [ schema_name . ] default_name 
    AS constant_expression [ ; ]
    CREATE DEFAULT DF_CurrentDateTime
    AS
        GETDATE()

    8.2 查看默认值定义

    EXEC sp_helptext DF_CurrentDateTime

    8.3 绑定默认值

    EXEC sp_bindefault 'DF_CurrentDateTime','[Product].[CreateDate]'

    8.4 取消默认值

    EXEC sp_unbindefault '[Product].[CreateDate]'

    8.5 删除默认值

    DROP DEFAULT DF_CurrentDateTime

    9 查看表中的约束

    EXEC sp_helpconstraint [Product]

  • 相关阅读:
    人生转折点:弃文从理
    人生第一站:大三暑假实习僧
    监听器启动顺序和java常见注解
    java常识和好玩的注释
    182. Duplicate Emails (Easy)
    181. Employees Earning More Than Their Managers (Easy)
    180. Consecutive Numbers (Medium)
    178. Rank Scores (Medium)
    177. Nth Highest Salary (Medium)
    176. Second Highest Salary(Easy)
  • 原文地址:https://www.cnblogs.com/libingql/p/4119859.html
Copyright © 2011-2022 走看看