在设计SQL数据库时,可能需要对哪些数据可以添加到表中的某些列加以限制。SQL通过使用约束来实现这一点。在对列或表应用约束之后,任何向列或表添加不符合约束的数据的尝试都会失败。
不同的SQL实现有自己独特的处理方式约束。本指南概述了许多数据库管理系统用于管理约束的语法,并以MySQL为例。
为了学习本指南,你需要一台运行某种使用SQL的关系数据库管理系统(RDBMS)的计算机。
注意:请注意,许多RDBMS使用它们自己独特的SQL实现。虽然本教程中概述的命令适用于大多数RDBMS,但如果你在MySQL以外的系统上测试它们,确切的语法或输出可能会有所不同。
你还需要一个装载了一些示例数据的数据库和表,可以在其中练习使用相关命令。
如果SQL数据库系统运行在远程服务器上,请从本地设备SSH到服务器:
ssh sammy@your_server_ip
然后打开MySQL服务器提示符,将==sammy==
替换为你的MySQL用户账户的名称:
mysql -u sammy -p
创建一个名为constraintsDB
的数据库:
CREATE DATABASE constraintsDB;
如果数据库成功创建,您将收到这样的输出:
OutputQuery OK, 1 row affected (0.01 sec)
要选择constraintsDB
数据库,运行以下USE
语句:
USE constraintsDB;
OutputDatabase changed
有了这些,你就可以开始学习如何在SQL中创建和管理约束了。
通常,约束是在创建表时定义的。下面的CREATE TABLE
语法创建了一个名为employeeInfo
的表,该表有三列:empId
、empName
和empPhoneNum
。该语句还对empId
列应用了UNIQUE
约束。这将防止表中任何一行的值都相同:
CREATE TABLE employeeInfo (
empId int UNIQUE,
empName varchar(30),
empPhoneNum int
);
这条语句在empId
列之后定义了UNIQUE
约束,这意味着该约束只适用于该列。如果你试图向这个表中添加任何数据,DBMS将只检查empId
的现有内容,以确保添加到empId
的任何新值实际上是唯一的。这就是所谓的列级约束。
你也可以在列定义之外应用约束。下面的示例创建一个名为racersInfo
的表有三列:racerId
、racerName
和finish
。在列定义的下面,它还对finish
列应用了CHECK
约束,以确保每个赛车手的终点都大于或等于1
(因为没有赛车手可以将名次低于第一名):
CREATE TABLE racersInfo (
racerId int,
finish int,
racerName varchar(30),
CHECK (finish > 0)
);
因为应用约束以外的任何个人列定义,您需要指定列的名称你想要约束适用于括号内。任何时候,当你在单个列的定义之外指定约束时,它被称为表级约束。列级约束只适用于单个列,但是像这样的表约束可以应用于或引用多个列。
无论何时定义约束,RDBMS都会自动为其生成名称。此名称用于在用于管理约束的命令中的错误消息中引用约束。
不过,有时数据库管理员为约束提供自己的名称会很方便。自动生成的约束名称通常没有描述性,所以自己提供一个名称可以帮助你记住约束的目的。
要给约束命名,在约束类型前面加上CONSTRAINT
关键字,然后是你选择的名称。这个示例语句再现了racersInfo
表,重命名newRacersInfo
,添加名为noNegativeFinish
的CHECK
约束:
CREATE TABLE newRacersInfo (
racerId int,
finish int,
racerName varchar(30),
CONSTRAINT noNegativeFinish
CHECK (finish >= 1)
);
注意:如果你没有为约束设置名称,或者你设置了但之后忘记了,你可能可以通过数据库管理系统的信息模式 (information schema)找到这个名称。许多现代数据库系统和客户端甚至提供了一种快捷方式来显示内部的CREATE
语句,以指示约束的名称。
下面是MySQL和PostgreSQL相关快捷方式的官方文档链接:
SHOW CREATE TABLE
语句,它返回创建命名表的整个CREATE TABLE
语句:SHOW CREATE TABLE table_name;
psql
有很多选项可以用来显示给定表的信息。\d
选项返回指定表的元数据:\d table_name
在MySQL中,你可以向已有的表添加约束,也可以使用ALTER TABLE
语句删除它们。
例如,下面的命令将UNIQUE
约束添加到前面创建的employeeInfo
表中的empName
列:
ALTER TABLE employeeInfo ADD UNIQUE (empName);
当向现有表添加约束时,你也可以使用constraint
关键字提供一个名称来标识约束。下面的例子在之前创建的racersInfo
表的racerId
列中添加了一个名为uID
的UNIQUE
约束:
ALTER TABLE racersInfo ADD CONSTRAINT uID UNIQUE (racerId);
之前添加一个这样的约束,如果你插入的任何记录,将违反条件的新约束,ALTER TABLE
语句将失败。
要删除约束,可以使用DROP CONSTRAINT
语法,后跟要删除的约束的名称。该命令删除上一个命令中创建的racersPK
约束:
ALTER TABLE racersInfo DROP CONSTRAINT uID;
通过阅读本指南,您学习了如何使用SQL向列和表添加和删除约束。虽然这里显示的命令在大多数关系型数据库上都可以工作,但请注意,每个SQL数据库都使用自己独特的语言实现。你应该咨询你的DBMS的官方文档的更完整的描述每个命令和完整的选项集。