在 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 应如下所示:

至此,您已经在 PostgreSQL 中创建好了表。下一节我们来看 Alter Table 的不同用法。
在 PostgreSQL 中执行不同的 ALTER TABLE 语句
本节将按前文所述,以以下两种方式演示 Alter Table 语句的用法:
添加、修改或删除列
先从添加一个名为 student_grade(字符类型)的新列开始:
ALTER TABLE student_details ADD student_grade VARCHAR(5);
技术支持
此时,表应如下所示:

请注意,您之前插入的记录在 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);
技术支持
结果如下图所示:

您也可以重命名列。如下所示:
ALTER TABLE student_details RENAME student_id TO student_roll;
技术支持
上述语句将 student_id 列重命名为 student_roll。您也可以通过一条 select 查询进行验证,结果应类似下图:

现在看看如何从表中删除列:
ALTER TABLE student_details DROP COLUMN student_year;
技术支持
该语句会删除 student_year 列。执行后,表应如下所示:

请注意,如果您要删除的列被其他表引用,可能会出现参照完整性约束违规错误。
接下来将演示如何向表添加和删除约束。
添加和删除约束。
当前 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');
技术支持
错误如下图所示:

删除约束的方式也类似。您需要指定要删除的约束名称。下面删除名为 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'); 就不应再报错。现在表中已包含该记录:

您也可以尝试其他 check 约束。
本教程到此结束!
本教程向您介绍了 Alter Table 语句,以便高效修改表的模式。如果您想进一步提升 SQL 技能,或许会对 DataCamp 提供的以下课程感兴趣:
在 SQL 中,主要有三类命令:
DDL(数据定义语言):用于定义数据库的 SQL 命令,包括创建表、提供规范、修改表等。DDL 的示例包括
CREATE、DROP、ALTER等。执行 DDL 命令引发的更改无法回滚。DML(数据操纵语言):用于运行查询如 select、insert、update 和 delete。执行 DML 命令引发的更改可以回滚。示例:
SELECT、INSERT、UPDATE和DELETE。DCL(数据控制语言):用于指定数据库系统的权限、许可和其他控制。
在本教程中,您将看到具有 DDL 属性的
ALTER TABLE语句的用法。本文将涵盖以下内容:ALTER TABLE语句的必要性ALTER TABLE语句注意:本教程不讲解如何在 PostgreSQL 中创建表、向表中插入数据或从表中查询数据。如果您需要复习这些主题,可以查看这篇文章。
ALTER TABLE 语句的必要性
数据库的规范可能会随着时间发生变化。例如,您可能需要向某个表添加一列,或者需要为某个表再添加一个主键,或者需要更改表中某列的数据类型。您往往无法承受删除整张表并从头重建的代价。
Alter Table语句可以让您非常顺畅地完成这些操作。借助Alter Table,您可以:您也可以启用/禁用约束,但这不在本教程的范围内。
本教程将分别演示上述每种用例。但在此之前,您需要在 PostgreSQL 中准备一张表以便开始。下一节将创建一个简单的表。
在 PostgreSQL 数据库中创建一张表
您将使用(
pgAdmin工具)在 PostgreSQL 中创建一张名为student_details的表,包含以下列及其数据类型:我们先从仅包含三列的这张表开始。随后,随着教程的推进,您将向这张表添加更多列,并以不同方式更改表。以下创建语句将根据上述规范创建表:
接着,向该表插入几条记录:
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应如下所示:至此,您已经在 PostgreSQL 中创建好了表。下一节我们来看
Alter Table的不同用法。在 PostgreSQL 中执行不同的 ALTER TABLE 语句
本节将按前文所述,以以下两种方式演示
Alter Table语句的用法:添加、修改或删除列
先从添加一个名为
student_grade(字符类型)的新列开始:此时,表应如下所示:
请注意,您之前插入的记录在
student_grade列上的值为null。这在大多数关系型数据库管理系统中会被默认处理。当然,您也可以执行 update 语句来更新这些值。现在来看如何使用Alter Table修改列。我们将把student_year列的最大可用长度从 100 改为 10,因为只存三位字符(student_year 只可能是 1st、2nd 或 3rd)却分配过多空间并不实际。结果如下图所示:
您也可以重命名列。如下所示:
上述语句将
student_id列重命名为student_roll。您也可以通过一条 select 查询进行验证,结果应类似下图:现在看看如何从表中删除列:
该语句会删除
student_year列。执行后,表应如下所示:请注意,如果您要删除的列被其他表引用,可能会出现参照完整性约束违规错误。
接下来将演示如何向表添加和删除约束。
添加和删除约束。
当前
student_details表没有主键。主键是 not null 与 unique 约束的组合。我们将把(从student_id重命名而来的)student_roll列指定为student_details的主键:您也可以添加其他约束,例如给
student_grade列添加check约束,使其值只能是A、B或C。year_check是您为该约束指定的名称。现在如果尝试向表中插入以下记录,应该会报错:错误如下图所示:
删除约束的方式也类似。您需要指定要删除的约束名称。下面删除名为
year_check的约束:我们来验证一下。如果
year_check约束确实已删除,那么这条语句INSERT INTO student_details(student_full_name, student_grade) VALUES('David Lune','3rd');就不应再报错。现在表中已包含该记录:您也可以尝试其他 check 约束。
本教程到此结束!
本教程向您介绍了
Alter Table语句,以便高效修改表的模式。如果您想进一步提升 SQL 技能,或许会对 DataCamp 提供的以下课程感兴趣: