如何在 SQL 中使用限制条件

介绍

设计 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,empNameempPhoneNum

1CREATE TABLE employeeInfo (
2empId int UNIQUE,
3empName varchar(30),
4empPhoneNum int
5);

此声明定义了UNIQUE限制在empId列之后,这意味着限制仅适用于该列. 如果您要尝试将任何数据添加到此表中,DBMS 将检查仅对empId的现有内容,以确保您添加到empId的任何新值实际上都是独一无二的。

下面的示例创建了一个名为racersInfo的表,其中包含三个列:racerId,racerNamefinish。在列定义下,它还将一个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

Published At
Categories with 技术
Tagged with
comments powered by Disqus