介绍
设计 SQL 数据库时,可能需要对可以添加到表中的某些列的数据施加限制。SQL 通过使用 constraints 来实现此功能。
不同的 SQL 实现方法有自己的独特方法来处理限制,本指南提供了许多数据库管理系统用于管理限制的语法概述,使用 MySQL 在整个例子中。
前提条件
要遵循本指南,您需要运行某种类型的关系数据库管理系统(RDBMS)的计算机,该系统使用SQL。
- 运行 Ubuntu 20.04 的服务器,具有非根用户的管理权限和与 UFW 配置的防火墙,如我们在 [Ubuntu 20.04 的初始服务器设置指南] 中所描述的。
<$>[注] 注:请注意,许多RDBMS使用自己的独特的SQL实现程序,虽然本教程中描述的命令将在大多数RDBMS上工作,但如果您在MySQL以外的系统上测试它们,精确的语法或输出可能会有所不同。
对 SQL 限制是什么以及它们是如何运作的总体理解也将有帮助. 对于这个概念的概述,您可以遵循我们的文章 理解 SQL 限制。
如果您没有这样的测试数据库,请参阅以下 连接到MySQL和设置示例数据库部分,以了解如何创建一个数据库的详细信息。
连接到并设置样本数据库
如果您的 SQL 数据库系统在远程服务器上运行,则从本地计算机进入您的服务器中的 SSH:
1[environment local]
2ssh sammy@your_server_ip
然后打开MySQL服务器提示,用您的MySQL用户帐户的名称代替sammy
:
1mysql -u sammy -p
创建一个名为constraintsDB
的数据库:
1CREATE DATABASE constraintsDB;
如果数据库创建成功,您将收到这样的输出:
1[secondary_label Output]
2Query OK, 1 row affected (0.01 sec)
若要选择constraintsDB
数据库,请运行以下USE
语句:
1USE constraintsDB;
1[secondary_label Output]
2Database changed
有了这一点,您可以随时遵循本指南的其余部分,并开始学习如何在 SQL 中创建和管理限制。
创建具有限制的表
通常情况下,您在创建表时会定义限制。下面的CREATE TABLE
语法会创建一个名为employeeInfo
的表,其中包含三个列:empId
,empName
和empPhoneNum
。
1CREATE TABLE employeeInfo (
2empId int UNIQUE,
3empName varchar(30),
4empPhoneNum int
5);
此声明定义了UNIQUE
限制在empId
列之后,这意味着限制仅适用于该列. 如果您要尝试将任何数据添加到此表中,DBMS 将检查仅对empId
的现有内容,以确保您添加到empId
的任何新值实际上都是独一无二的。
下面的示例创建了一个名为racersInfo
的表,其中包含三个列:racerId
,racerName
和finish
。在列定义下,它还将一个CHECK
的限制应用到finish
列中,以确保每个赛车手的终点大于或等于1
(因为没有赛车手可以排在第一位以下):
1CREATE TABLE racersInfo (
2racerId int,
3finish int,
4racerName varchar(30),
5CHECK (finish > 0)
6);
由于限制被应用于任何单个列定义之外,您需要在中指定限制所适用于列的名称。 任何时候,您指定一个限制在单个列定义之外,它被称为 _table-level restriction。
限制名称
当您定义一个限制时,您的 RDBMS 会自动生成一个名称,该名称用于在用于管理限制的命令中引用错误消息中的限制。
然而,有时,数据库管理员可以方便地为限制提供自己的名称。自动生成的限制名称通常不是描述性的,因此提供一个名称可以帮助您记住限制的目的。
若要命名限制,请在限制类型之前使用CONSTRAINT
的关键字,然后是您选择的名称。本示例声明重现了racersInfo
表,将其改名为newRacersInfo
,并将No NegativeFinish
作为CHECK
限制的名称:
1CREATE TABLE newRacersInfo (
2racerId int,
3finish int,
4racerName varchar(30),
5CONSTRAINT noNegativeFinish
6CHECK (finish >= 1)
7);
<$>[注意] 注意:如果您没有为限制设置一个名称,或者您后来忘记了它,您可能会通过咨询数据库管理系统的 information schemas来找到该名称。
以下是有关MySQL和PostgreSQL的简介的官方文档的链接:
- MySQL:MySQL包含
SHOW CREATE TABLE
语句,返回创建命名表的整个CREATE TABLE
语句:
1SHOW CREATE TABLE table_name;
- PostgreSQL: PostgreSQL 客户端
psql
有几个选项,您可以使用它来揭示有关某个表的信息。
1\d table_name
美元
管理限制
在MySQL中,您可以将限制添加到现有表中,也可以用ALTER TABLE
语句删除它们。
例如,下列命令会将UNIQUE
限制添加到以前创建的employeeInfo
表中的empName
列中:
1ALTER TABLE employeeInfo ADD UNIQUE (empName);
当您将限制添加到现有表中时,您还可以使用CONSTRAINT
关键字来提供一个名称来识别该限制。
1ALTER TABLE racersInfo ADD CONSTRAINT uID UNIQUE (racerId);
如果在添加此类限制之前,您插入了违反新限制条件的任何记录,则ALTER TABLE
语句将失败。
要删除约束,请使用DROP CONSTRAINT
语法,然后是您想要删除的约束的名称。
1ALTER TABLE racersInfo DROP CONSTRAINT uID;
结论
通过阅读本指南,您了解如何使用 SQL 添加和删除对列和表的限制. 虽然这里显示的命令应该在大多数关系数据库上工作,但请注意,每个 SQL 数据库都使用其独特的语言实现。
如果您想了解有关使用 SQL 的更多信息,我们鼓励您查看本系列中的其他教程在 如何使用 SQL。