• SQL的约束(下)


    SQL的约束(下):

    数据库表:

     er图:

     

    D. SQL Server唯一约束

    SQL Server UNIQUE约束简介

    SQL Server UNIQUE 约束用于确保存储在列或列组中的数据在表中的行中是唯一的。

    以下语句创建一个表: hr.persons ,其 email 邮件列中的数据在表的行中是唯一的:

    在此语法中,将 UNIQUE 约束定义为列约束。 还可以将 UNIQUE 约束定义为表约束:

     

    SQL Server自动创建 UNIQUE 索引以强制存储在参与 UNIQUE 约束的列中的数据的唯一性。

    因此,如果尝试插入重复行,SQL Server将拒绝更改并返回一条错误消息,提示说已违反 UNIQUE 约 束。

    以下语句在 hr.persons 表中插入一个新行:

    上面语句按预期工作。 由于 email 具有 UNIQUE 约束,同一表中 email 列的值不能相同,所以下面插入 语句会失败:

     

    SQL Server发出类似下面错误消息:

     

    如果没有为 UNIQUE 约束指定名称,SQL Server将自动为其生成名称。

    在此示例中,自动生成的约束名称为: UQ__persons__XAXCDXXXXXE8240E4E ,是不是有点不太可读? 要为 UNIQUE 约束指定特定名称,请使用 CONSTRAINT 关键字,如下所示: 

     

    上面语句中,指定了 UNIQUE 约束名称为: unique_email 。

    为 UNIQUE 约束指定名称的好处是:

    1. 更容易对错误消息进行分类。
    2. 修改约束时,可以引用此约束的名称。

    UNIQUE约束与PRIMARY KEY约束

    尽管 UNIQUE 和 PRIMARY KEY 约束都强制数据的唯一性,但是当要强制实现不是主键列的列或列组的唯一性时,应使用 UNIQUE 约束而不是 PRIMARY KEY 约束。

    与 PRIMARY KEY 约束不同, UNIQUE 约束允许 NULL 值。 此外, UNIQUE 约束将 NULL 视为常规值,因 此,它只允许每列一个 NULL 。

    以下语句插入一行,其 email 列中的值为 NULL :

     

    现在,如果尝试在 email 列中再插入一个 NULL ,则会收到错误消息:

     

    执行上面插入语句,将会提示以下错误:

     

    具有多列的UNIQUE约束

    要为一组列定义 UNIQUE 约束,可以将其写为表约束,列名以逗号分隔,如下所示:

     

    以下示例创建一个 UNIQUE 约束,此约束包含两列:person_id 和 skill_id : 

     

    UNIQUE约束添加到列

    将 UNIQUE 约束添加到表中的现有列或一组列时,SQL Server首先检查这些列中的现有数据,以确保所 有值都是唯一的。

    如果SQL Server找到重复值,则它将返回错误,并且不会执行添加 UNIQUE 约束。

    以下显示了向表中添加 UNIQUE 约束的语法:

     

    假设有以下 hr.persons 表:

     

    以下语句向 email 列添加 UNIQUE 约束:

     

    类似地,以下语句将向 phone 列添加 UNIQUE 约束:

     

    删除UNIQUE约束

    要删除 UNIQUE 约束,请使用 ALTER TABLE DROP CONSTRAINT 语句,如下所示:

     

    以下语句用于从 hr.person 表中删除名称为: unique_phone 的约束:  

     

    修改UNIQUE约束:

    SQL Server没有任何直接语句来修改 UNIQUE 约束,因此,如果要更改约束,则需要先删除约束并重新 创建约束。

    SQL UNIQUE 约束

    SQL UNIQUE 约束

    UNIQUE 约束唯一标识数据库表中的每条记录。

    UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。

    PRIMARY KEY 拥有自动定义的 UNIQUE 约束。

    请注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。

    SQL UNIQUE Constraint on CREATE TABLE

    下面的 SQL 在 "Persons" 表创建时在 "Id_P" 列创建 UNIQUE 约束:

    MySQL:

     

    

    CREATE TABLE Persons
    (
    Id_P int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255),
    UNIQUE (Id_P)
    )
    

    SQL Server / Oracle / MS Access:

     

    

    CREATE TABLE Persons
    (
    Id_P int NOT NULL UNIQUE,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255)
    )
    

    如果需要命名 UNIQUE 约束,以及为多个列定义 UNIQUE 约束,请使用下面的 SQL 语法:

    MySQL / SQL Server / Oracle / MS Access:

     

    

    CREATE TABLE Persons
    (
    Id_P int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255),
    CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)
    )
    

    SQL UNIQUE Constraint on ALTER TABLE

    当表已被创建时,如需在 "Id_P" 列创建 UNIQUE 约束,请使用下列 SQL:

    MySQL / SQL Server / Oracle / MS Access:

     

    

    ALTER TABLE Persons
    ADD UNIQUE (Id_P)
    

    如需命名 UNIQUE 约束,并定义多个列的 UNIQUE 约束,请使用下面的 SQL 语法:

    MySQL / SQL Server / Oracle / MS Access:

    ALTER TABLE Persons
    ADD CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)
    

    撤销 UNIQUE 约束

    如需撤销 UNIQUE 约束,请使用下面的 SQL:

    MySQL:

     

    

    ALTER TABLE Persons
    DROP INDEX uc_PersonID
    

    SQL Server / Oracle / MS Access:

    ALTER TABLE Persons
    DROP CONSTRAINT uc_PersonID
    

    E. SQL Server检查约束

    SQL Server CHECK约束简介

    CHECK约束用于指定必须满足布尔表达式的列中的值。

    例如,要求价格必须为正数值,可以使用:

     

    如上所见, CHECK 约束定义位于数据类型之后。 它由 CHECK 关键字和括号中的逻辑表达式组成:

     

    还可以使用 CONSTRAINT 关键字为约束分配单独的名称,如下所示:

     

    显式名称有助于对错误消息进行分类,并允许在要修改它们时引用约束。

    如果未以这种方式指定约束名称,SQL Server会自动生成名称(随机字符)。

    请参阅以下插入语句:

     

    SQL Server发出以下错误:

     

    发生错误的原因是单价不大于 CHECK 约束中指定的 0 值。

    以下语句可以正常工作,因为 CHECK 约束中定义的逻辑表达式的计算结果为 TRUE : 

     

    SQL Server CHECK约束和NULL

    CHECK 约束拒绝导致布尔表达式求值为 FALSE 的值。

    因为 NULL 计算为 UNKNOWN ,所以可以在表达式中使用它来绕过约束。

    例如,可以插入单价为 NULL 的产品,如以下查询中所示:

     

    上面语句能够成功地执行。

    SQL Server将 NULL 插入 unit_price 列,但未返回错误。

    要解决此问题,需要对 unit_price 列使用 NOT NULL 约束。

    检查引用多列的约束:

    CHECK 约束可以引用多个列。 例如,在 test.products 表中存储常规和折扣价格,并且希望确保折扣价格始终低于常规价格:

     

    unit_price 和 discounted_price 的前两个约束看起来应该很熟悉。

    第三个约束使用未附加到特定列的新语法。它在逗号分隔列列表中显示为单独的行项目。

    前两列约束是列约束,而第三列约束是表约束。

    注意,可以将列约束写为表约束。 但是,不能将表约束写为列约束。 例如,可以按如下方式重写上述语句:

     

    又或者,

     

    还可以使用与列约束相同的方式为表约束指定名称:

     

    CHECK约束添加到现有表:

    要将 CHECK 约束添加到现有表,可使用 ALTER TABLE ADD CONSTRAINT 语句。

    假设有以下一个名称 test.products 表:

     

    要将 CHECK 约束添加到 test.products 表,请使用以下语句:

     

    要添加带有 CHECK 约束的新列,请使用以下语句:

     

    要添加名为 valid_price 的 CHECK 约束,请使用以下语句:

     

    删除CHECK约束:

    要删除 CHECK 约束,请使用 ALTER TABLE DROP CONSTRAINT 语句:

     

    如果为 CHECK 约束指定了名称,则可以在语句中引用该名称。

    但是,如果不确定有没有为 CHECK 约束指定名称,可使用以下语句查看:

     

    例如:

     

    此语句发出许多信息,包括约束名称:

     

    以下语句删除 positive_price 约束:

     

    禁用CHECK约束:

    要禁用插入或更新的 CHECK 约束,请使用以下语句:

     

    以下语句禁用 valid_price 约束:

     

    SQL CHECK 约束

    SQL CHECK 约束

    CHECK 约束用于限制列中的值的范围。

    如果对单个列定义 CHECK 约束,那么该列只允许特定的值。

    如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。

    SQL CHECK Constraint on CREATE TABLE

    下面的 SQL 在 "Persons" 表创建时为 "Id_P" 列创建 CHECK 约束。CHECK 约束规定 "Id_P" 列必须只包含大于 0 的整数。

    My SQL:

     

    

    CREATE TABLE Persons
    (
    Id_P int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255),
    CHECK (Id_P>0)
    )
    

    SQL Server / Oracle / MS Access:

     

    

    CREATE TABLE Persons
    (
    Id_P int NOT NULL CHECK (Id_P>0),
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255)
    )
    

    如果需要命名 CHECK 约束,以及为多个列定义 CHECK 约束,请使用下面的 SQL 语法:

    MySQL / SQL Server / Oracle / MS Access:

    CREATE TABLE Persons
    (
    Id_P int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255),
    CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
    )

    SQL CHECK Constraint on ALTER TABLE

    如果在表已存在的情况下为 "Id_P" 列创建 CHECK 约束,请使用下面的 SQL:

    MySQL / SQL Server / Oracle / MS Access:

     

    

    ALTER TABLE Persons
    ADD CHECK (Id_P>0)
    

    如果需要命名 CHECK 约束,以及为多个列定义 CHECK 约束,请使用下面的 SQL 语法:

    MySQL / SQL Server / Oracle / MS Access:

     

    

    ALTER TABLE Persons
    ADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
    

    撤销 CHECK 约束

    如需撤销 CHECK 约束,请使用下面的 SQL:

    SQL Server / Oracle / MS Access:

     

    

    ALTER TABLE Persons
    DROP CONSTRAINT chk_Person
    

    MySQL:

    ALTER TABLE Persons
    DROP CHECK chk_Person
    

    以上就是我最近整理的新的知识内容,现在分享给你们,希望可以帮助到你们。

  • 相关阅读:
    web应用及微信小程序版本更新检测方案实践
    信息安全-网络安全的三大支柱和攻击向量
    windows服务器证书算法升级
    中国石油大学(北京)-《油藏工程》第三阶段在线作业
    基于Maven的Mybatis开发环境搭建
    【JavaEE】Callable 接口
    中国数据中台未来会怎样?三个趋势预测为您指明方向
    【80天学习完《深入理解计算机系统》】第十五天 4.1 Y86-64指令集与Verilog HDL
    D. X-Magic Pair(辗转相除)
    【具身智能评估2】具身视觉语言规划(EVLP)数据集基准汇总
  • 原文地址:https://blog.csdn.net/TTYLXWT/article/details/127092094