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]

  • 相关阅读:
    SDP(12): MongoDB-Engine
    SDP(11):MongoDB-Engine功能实现
    SDP(10):文本式大数据运算环境-MongoDB-Engine功能设计
    React Native(五)——获取设备信息react-native-device-info
    React Native(四)——顶部以及底部导航栏实现方式
    去掉a标签
    React Native(三)——推送jpush-react-native
    react native (一)
    《JavaScript 秘密花园》
    正则表达式(overall)
  • 原文地址:https://www.cnblogs.com/libingql/p/4119859.html
Copyright © 2011-2022 走看看