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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值