SQL ADD COLUMN

2025年7月24日 | 阅读 7 分钟

结构化查询语言是用于处理关系数据库的最常用语言。它帮助我们创建、管理和操作存储在关系数据库系统中的数据。
在不删除或重新创建表的情况下更改表结构的能力是 SQL 的强大功能之一。有时我们希望向现有表添加新列以存储更多信息,这可以通过 SQL 中的 ADD COLUMN 命令 完成。

SQL 中的 ADD COLUMN

在许多情况下,您可能需要向现有表添加新列或字段。SQL 提供了带有 ALTER TABLE 命令的 ADD 关键字来解决这种情况。ADD COLUMN 是 SQL 中用于向现有表添加新列的命令。当您的表需要存储以前未包含的新数据类型或信息时,此命令很有用。

ALTER TABLECREATE TABLE 是结构化查询语言中两个不同的语句,它们允许您添加列,但两者之间的区别在于 CREATE TABLE 语句在表创建时添加列,而 ALTER TABLE 语句稍后在现有表中添加一个或多个列。

语法

参数

ALTER TABLE: 这告诉数据库更改表的结构。

ADD COLUMN: 这将添加一个新列。

column_name: 它是新列的名称。

data_type: 它是列存储的数据类型,例如 INT、VARCHAR、DATE 等。

使用查询和表的实际示例

让我们创建一个名为 employees 的表,其中包含 emp_idemp_name 字段。

现在将数据插入 employees 表中。

我们将使用 SELECT 查询 来检索数据。

表 "employees"

emp_idemp_name
1维拉特·科利
2克里斯·盖尔
3约翰·塞纳

示例 1:添加年龄列

让我们向 employees 表添加一个名为 age 的新列。

SQL 查询

输出

emp_idemp_name年龄
1维拉特·科利NULL
2克里斯·盖尔NULL
3约翰·塞纳NULL

说明

我们没有为 age 列指定值。默认情况下,在新列中,每行中的值都将为 NULL,直到我们为其指定值。

示例 2:添加入职日期列

让我们向 employees 表 添加一个名为 join_date 的新列。

SQL 查询

输出

emp_idemp_name年龄join_date
1维拉特·科利NULLNULL
2克里斯·盖尔NULLNULL
3约翰·塞纳NULLNULL

说明

我们添加了一个名为 join_date 的新列来存储每个员工的入职日期。所有现有行在新列中默认包含 NULL 值。

示例 3:添加带有默认值的列

到目前为止,我们只添加了没有值的新列。现在,让我们通过将默认值指定为 HR 来向 employees 表添加一个新列 department

SQL 查询

输出

emp_idemp_name年龄join_datedepartment
1维拉特·科利NULLNULLHR
2克里斯·盖尔NULLNULLHR
3约翰·塞纳NULLNULLHR

说明

在输出中,我们可以看到一个名为 department 的新列,其默认值为 'HR'。结果,所有现有行在新列中自动接收 'HR' 值。

示例 4:一次添加多列

我们还可以通过指定列名及其类型一次添加多列。让我们向 employees 表添加名为 emailsalary 的新列。

SQL 查询

输出

emp_idemp_name年龄join_datedepartmentemailsalary
1维拉特·科利NULLNULLHRNULLNULL
2克里斯·盖尔NULLNULLHRNULLNULL
3约翰·塞纳NULLNULLHRNULLNULL

说明

我们通过一个查询向 employees 表添加了两个新列,名为 emailsalary。由于未提供默认值,因此所有现有行的这两个列都填充为 NULL。

现在从 示例 5 开始,我们将通过考虑只有 emp_idemp_name 的实际 employees 表来探索一些具有特殊功能的示例。

考虑以下 employees

emp_idemp_name
1维拉特·科利
2克里斯·盖尔
3约翰·塞纳

示例 5:添加 is_active 列(带默认值的 BOOLEAN)

如果我们想知道员工是否活跃,那么我们将向 employees 表添加新列 is_active 并指定一个 布尔值 为 true。

注意:使用布尔值时,重要的是要记住 TRUE 给出 '1' 作为输出,FALSE 给出 '0' 作为输出。

SQL 查询

输出

emp_idemp_nameis_active
1维拉特·科利1
2克里斯·盖尔1
3约翰·塞纳1

说明

在输出中,添加了一个名为 is_active 的新列,其默认值为 TRUE,以指示员工的状态。结果,所有现有记录在此列中自动显示 TRUE (1)。

示例 6:添加 bonus 列(带 NULL 的 DECIMAL)

让我们添加一个名为 bonus 的十进制类型新列。

SQL 查询

输出

emp_idemp_nameis_activebonus
1维拉特·科利1NULL
2克里斯·盖尔1NULL
3约翰·塞纳1NULL

说明

我们添加了一个没有默认值的 DECIMAL 类型的 bonus 新列,因此所有现有行在手动插入值之前都显示 NULL。

DECIMAL(8,2) 中,这两个数字定义了精度和刻度

  • 8 是精度,这意味着允许的 小数点前 的总位数。
  • 2 是刻度,这意味着允许的 小数点后 的位数。

示例 7:添加 gender 列(带默认值的 VARCHAR)

现在,我们将向 employees 表添加一个名为 gender 的新列,默认值为 'Male'。

SQL 查询

输出

emp_idemp_nameis_activebonusgender
1维拉特·科利1NULL男性 (Male)
2克里斯·盖尔1NULL男性 (Male)
3约翰·塞纳1NULL男性 (Male)

说明

在输出中,gender 列已添加到表中,默认值为 'Male',这意味着所有现有行都将获取 'Male' 作为值。

示例 8:添加 last_updated 列(带当前时间的 TIMESTAMP)

我们将向 employees 表添加新列 last_updated,其默认值为当前时间的 timestamp。

SQL 查询

输出

emp_idemp_nameis_activebonusgenderlast_updated
1维拉特·科利TRUENULL未指定2025-07-10
14:38:41
2克里斯·盖尔TRUENULL未指定2025-07-10
14:38:41
3约翰·塞纳TRUENULL未指定2025-07-10
14:38:41

说明

添加了一个名为 last_updated 的新列,其默认值为当前时间戳。因此,所有现有行都会自动存储添加列时的日期和时间。

ADD COLUMN 的局限性

  • 并非所有数据库都支持在特定位置插入列,例如“在第三列之后”。
  • 使用的数据类型必须由数据库系统支持。
  • 在非常大的表上添加列可能需要时间或暂时锁定表。
  • 在某些系统中,如果没有默认值,添加带有 NOT NULL 的列可能会失败。
  • 除非给定默认值,否则新列将包含现有数据的 NULL。

结论

当您的表结构需要随着数据需求的变化而增长时,SQL ADD COLUMN 命令非常有用。您可以使用 ADD COLUMN 命令随时轻松修改数据库。它允许您保持数据井井有条,而无需重新创建整个表。它是每个初学者和中级用户都应该了解的基本但功能强大的 SQL 命令。

常见问题解答 (FAQs)

1. 当我添加新列时,现有数据会发生什么?

当您添加新列时,表中现有数据保持不变。新列将为所有现有行显示 NULL,除非设置了默认值。

2. 我可以同时添加多列吗?

可以!您可以通过用逗号分隔它们,在一条 ALTER TABLE 命令中添加多列。

语法

3. 我可以添加带约束的列吗?

可以,但这取决于数据库。例如

如果已经有行且未设置默认值,这可能会导致错误,因为 NOT NULL 不允许空值。

4. 如何在表的特定位置添加列?

标准 SQL 不允许设置新列的位置。但是,MYSQL 支持。

MySQL 语法

不支持在特定位置插入列的数据库有 PostgreSQLOracle 或 SQL Server。

5. 如果我不再需要该列,可以删除它吗?

可以,如果不再需要该列,您可以删除它。

语法

此语法将永久删除该列及其所有数据。