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 约束指定名称的好处是:
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 约束,因此,如果要更改约束,则需要先删除约束并重新 创建约束。
UNIQUE 约束唯一标识数据库表中的每条记录。
UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。
PRIMARY KEY 拥有自动定义的 UNIQUE 约束。
请注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。
下面的 SQL 在 "Persons" 表创建时在 "Id_P" 列创建 UNIQUE 约束:
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)
)
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 语法:
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)
)
当表已被创建时,如需在 "Id_P" 列创建 UNIQUE 约束,请使用下列 SQL:
ALTER TABLE Persons
ADD UNIQUE (Id_P)
如需命名 UNIQUE 约束,并定义多个列的 UNIQUE 约束,请使用下面的 SQL 语法:
ALTER TABLE Persons
ADD CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)
如需撤销 UNIQUE 约束,请使用下面的 SQL:
ALTER TABLE Persons
DROP INDEX uc_PersonID
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 约束:
CHECK 约束用于限制列中的值的范围。
如果对单个列定义 CHECK 约束,那么该列只允许特定的值。
如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。
下面的 SQL 在 "Persons" 表创建时为 "Id_P" 列创建 CHECK 约束。CHECK 约束规定 "Id_P" 列必须只包含大于 0 的整数。
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)
)
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 语法:
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')
)
如果在表已存在的情况下为 "Id_P" 列创建 CHECK 约束,请使用下面的 SQL:
ALTER TABLE Persons
ADD CHECK (Id_P>0)
如果需要命名 CHECK 约束,以及为多个列定义 CHECK 约束,请使用下面的 SQL 语法:
ALTER TABLE Persons
ADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
如需撤销 CHECK 约束,请使用下面的 SQL:
ALTER TABLE Persons
DROP CONSTRAINT chk_Person
ALTER TABLE Persons
DROP CHECK chk_Person
以上就是我最近整理的新的知识内容,现在分享给你们,希望可以帮助到你们。