IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> SQL的约束(下) -> 正文阅读

[大数据]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

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

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-09-30 00:59:31  更:2022-09-30 01:00:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年5日历 -2025/5/1 14:59:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码