跳至主要内容

SQL 中 ALTER TABLE 语句入门

在本教程中,您将学习如何在 SQL 中使用并应用 ALTER TABLE 语句。
· 7分钟 阅读

使用 AI 探索

在 SQL 中,主要有三类命令:

  • DDL(数据定义语言):用于定义数据库的 SQL 命令,包括创建表、提供规范、修改表等。DDL 的示例包括 CREATE、DROP、ALTER 等。执行 DDL 命令引发的更改无法回滚。

  • DML(数据操纵语言):用于运行查询如 select、insert、update 和 delete。执行 DML 命令引发的更改可以回滚。示例:SELECT、INSERT、UPDATE 和 DELETE。

  • DCL(数据控制语言):用于指定数据库系统的权限、许可和其他控制。

在本教程中,您将看到具有 DDL 属性的 ALTER TABLE 语句的用法。本文将涵盖以下内容:

  • ALTER TABLE 语句的必要性
  • 在 PostgreSQL 数据库中创建一张表
  • 在 PostgreSQL 中执行不同的 ALTER TABLE 语句

注意:本教程不讲解如何在 PostgreSQL 中创建表、向表中插入数据或从表中查询数据。如果您需要复习这些主题,可以查看这篇文章。

ALTER TABLE 语句的必要性

数据库的规范可能会随着时间发生变化。例如,您可能需要向某个表添加一列,或者需要为某个表再添加一个主键,或者需要更改表中某列的数据类型。您往往无法承受删除整张表并从头重建的代价。Alter Table 语句可以让您非常顺畅地完成这些操作。借助 Alter Table,您可以:

  • 添加、修改或删除列
  • 添加或删除约束

您也可以启用/禁用约束,但这不在本教程的范围内。

本教程将分别演示上述每种用例。但在此之前,您需要在 PostgreSQL 中准备一张表以便开始。下一节将创建一个简单的表。

在 PostgreSQL 数据库中创建一张表

您将使用(pgAdmin 工具)在 PostgreSQL 中创建一张名为 student_details 的表,包含以下列及其数据类型:

  • student_id(integer)
  • student_full_name(character)
  • student_year(integer)

我们先从仅包含三列的这张表开始。随后,随着教程的推进,您将向这张表添加更多列,并以不同方式更改表。以下创建语句将根据上述规范创建表:

CREATE TABLE student_details(
 student_id SERIAL,
 student_full_name VARCHAR (50),
 student_year VARCHAR (100)
);

接着,向该表插入几条记录:

  • INSERT INTO student_details(student_full_name, student_year) VALUES('John Doe','1st');
  • INSERT INTO student_details(student_full_name, student_year) VALUES('Chris Villa','3rd');

由于 student_id 的数据类型设置为 SERIAL,PostgreSQL 会自动递增该列的值,并默认将该数据类型解释为 integer。

表 student_details 应如下所示:

Table of student_details

至此,您已经在 PostgreSQL 中创建好了表。下一节我们来看 Alter Table 的不同用法。

在 PostgreSQL 中执行不同的 ALTER TABLE 语句

本节将按前文所述,以以下两种方式演示 Alter Table 语句的用法:

  • 添加、修改和删除列
  • 添加和删除约束

添加、修改或删除列

先从添加一个名为 student_grade(字符类型)的新列开始:

ALTER TABLE student_details ADD student_grade VARCHAR(5);

此时,表应如下所示:

Table of student_details with student_grade column

请注意,您之前插入的记录在 student_grade 列上的值为 null。这在大多数关系型数据库管理系统中会被默认处理。当然,您也可以执行 update 语句来更新这些值。现在来看如何使用 Alter Table 修改列。我们将把 student_year 列的最大可用长度从 100 改为 10,因为只存三位字符(student_year 只可能是 1st、2nd 或 3rd)却分配过多空间并不实际。

ALTER TABLE student_details ALTER COLUMN student_year TYPE VARCHAR(10);

结果如下图所示:

Table of student_details with student_year (10)

您也可以重命名列。如下所示:

ALTER TABLE student_details RENAME student_id TO student_roll;

上述语句将 student_id 列重命名为 student_roll。您也可以通过一条 select 查询进行验证,结果应类似下图:

Table of student_details with renamed column to student_roll

现在看看如何从表中删除列:

ALTER TABLE student_details DROP COLUMN student_year;

该语句会删除 student_year 列。执行后,表应如下所示:

Table of student_details after dropping student_year column

请注意,如果您要删除的列被其他表引用,可能会出现参照完整性约束违规错误。

接下来将演示如何向表添加和删除约束。

添加和删除约束。

当前 student_details 表没有主键。主键是 not null 与 unique 约束的组合。我们将把(从 student_id 重命名而来的)student_roll 列指定为 student_details 的主键:

ALTER TABLE student_details ADD PRIMARY KEY (student_roll);

您也可以添加其他约束,例如给 student_grade 列添加 check 约束,使其值只能是 A、B 或 C。

ALTER TABLE student_details ADD CONSTRAINT year_check CHECK (student_grade IN ('A', 'B', 'C'));

year_check 是您为该约束指定的名称。现在如果尝试向表中插入以下记录,应该会报错:

INSERT INTO student_details(student_full_name, student_grade) VALUES('David Lune','3rd');

错误如下图所示:

error result

删除约束的方式也类似。您需要指定要删除的约束名称。下面删除名为 year_check 的约束:

ALTER TABLE student_details DROP CONSTRAINT year_check;

我们来验证一下。如果 year_check 约束确实已删除,那么这条语句 INSERT INTO student_details(student_full_name, student_grade) VALUES('David Lune','3rd'); 就不应再报错。现在表中已包含该记录:

final table

您也可以尝试其他 check 约束。

本教程到此结束!

本教程向您介绍了 Alter Table 语句,以便高效修改表的模式。如果您想进一步提升 SQL 技能,或许会对 DataCamp 提供的以下课程感兴趣:

主题