SQL Server 约束的管理

作者: 2abc3927e84f | 来源:发表于2017-03-17 15:38 被阅读57次

    约束是一种限制。通过在列级或表级设置约束,确保数据符合某种数据完整性规则。

    约束的类型

    1. 域约束:域约束处理一个或多个列,例如CHECK约束和DEFAULT约束。
    2. 实体约束:实体约束都是关于比较行的,例如主键约束和唯一约束。
    3. 参照完整性约束:如果某列的值必须与其他列(该列可能在同一个表中,或者更通常的是在不同的表中)的值匹配,就意味着创建了参照完整性约束。例如主键约束和外键约束。

    键约束:键是数据库设计和管理的基本概念之一。包括四种类型:主键、外键、替换键、和倒置键(索引)。

    主键约束

    1. 在创建表的时候添加主键约束

    CREATE TABLE T1 (
      ID int PRIMARY KEY,  -- 在创建表的时候添加主键约束
      Description varchar(500)
    );
    

    2. 在已存在的表上添加主键约束

    ALTER TABLE T1
      ADD CONSTRAINT PK_T1_ID
      PRIMARY KEY (ID);
    

    外键约束

    1. 在创建表的时候添加外键约束

    -- <column name> <data type> <nullability>
    -- FOREIGN KEY REFERENCES <table name>(<column name>)
    -- [ON DELETE {CASCADE|NO ACTION|SET NULL|SET DEFAULT}]
    -- [ON UPDATE {CASCADE|NO ACTION|SET NULL|SET DEFAULT}]
    
    CREATE TABLE T2 (
      ID int PRIMARY KEY,
      RID int FOREIGN KEY REFERENCES T1 (ID), -- 在创建表的时候添加外键约束
      Description varchar(500)
    );
    

    2. 在已存在的表上添加外键约束

    ALTER TABLE T2
      ADD CONSTRAINT FK_T2_ID
      FOREIGN KEY (RID) REFERENCES T1 (ID);
    

    唯一约束(替换键)

    1. 在创建表的时候添加唯一约束

    CREATE TABLE T1 (
      ID int PRIMARY KEY,
      NO varchar(50) UNIQUE,  -- 在创建表的时候添加唯一约束
      Description varchar(500)
    );
    

    2. 在已存在的表上添加唯一约束

    ALTER TABLE T1
      ADD CONSTRAINT UQ_T1_NO
      UNIQUE (NO)
    

    CHECK 约束

    1. 在创建表的时候添加CHECK约束

    CREATE TABLE T1 (
      ID int PRIMARY KEY, 
      Description varchar(500),
      CreateDate datetime2 CHECK (CreateDate >= '1990-01-01')  -- 在创建表的时候添加CHECK约束
    );
    

    2. 在已存在的表上添加CHECK约束

    ALTER TABLE T1
      ADD CONSTRAINT CN_T1_CreateDate
      CHECK (CreateDate >= '1990-01-01')
    

    DEFAULT 约束

    1. 在创建表的时候添加DEFAULT约束

    CREATE TABLE T1 (
      ID int PRIMARY KEY,
      Description varchar(500),
      CreateDate datetime2 DEFAULT GETDATE() -- 在创建表的时候添加DEFAULT约束
    );
    

    2. 在已存在的表上添加DEFAULT约束

    ALTER TABLE T1
      ADD CONSTRAINT CN_T1_CreateDate
      DEFAULT GETDATE() FOR CreateDate;
    

    禁用约束

    1. 在添加约束时忽略已存在的无效数据

    ALTER TABLE <table name>
      WITH NOCHECK  -- 在添加约束时忽略已存在的无效数据
      ADD CONSTRAINT <constraint name>
      <constraint type> <other content ...>
    

    2. 临时禁用已存在的约束

    ALTER TABLE <table name>
      NOCHECK  -- 临时禁用已存在的约束
      CONSTRAINT <constraint name>
    
    ALTER TABLE <table name>
      CHECK  -- 再次启用约束
      CONSTRAINT <constraint name>
    

    注意:只允许禁用外键约束和CHECK约束,不能禁用主键约束和唯一约束。

    删除约束

    ALTER TABLE <table name>
      DROP -- 删除约束
      CONSTRAINT <constraint name>
    

    查看约束

    EXEC sp_helpconstraint <table name>  -- 查看数据表中的所有列的约束
    

    规则和默认值

    规则和默认值的引用要早于CHECK和DEFAULT约束。它们是较老的SQL Server备用约束的一部分,当然也不是没有优点。因此,建议您了解一下它们的向后兼容性和遗留代码,这里不再详细解释。规则和默认值不遵循ANSI标准(这产生了移植问题),而且性能不如约束好。自7.0版本之后,Microsoft列出规则和默认值只是为了向后兼容,而不准备在以后继续支持这个功能。

    参考

    *《SQLServer2012编程入门经典(第4版)》

    相关文章

      网友评论

        本文标题:SQL Server 约束的管理

        本文链接:https://www.haomeiwen.com/subject/bveenttx.html