⌘+k ctrl+k
1.4 (LTS)
搜索快捷键 cmd + k | ctrl + k
ALTER TABLE 语句

ALTER TABLE 语句用于更改目录中现有表的架构。

示例

CREATE TABLE integers (i INTEGER, j INTEGER);

向表 integers 添加一个名为 k 的新列,它将填充默认值 NULL

ALTER TABLE integers
ADD COLUMN k INTEGER;

向表 integers 添加一个名为 l 的新列,它将填充默认值 10

ALTER TABLE integers
ADD COLUMN l INTEGER DEFAULT 10;

从表 integers 中删除列 k

ALTER TABLE integers
DROP k;

使用标准转换将列 i 的类型更改为 VARCHAR 类型

ALTER TABLE integers
ALTER i TYPE VARCHAR;

使用指定的表达式转换每一行的数据,将列 i 的类型更改为 VARCHAR 类型

ALTER TABLE integers
ALTER i SET DATA TYPE VARCHAR USING concat(i, '_', j);

设置列的默认值

ALTER TABLE integers
ALTER COLUMN i SET DEFAULT 10;

删除列的默认值

ALTER TABLE integers
ALTER COLUMN i DROP DEFAULT;

设置列为不可为空

ALTER TABLE integers
ALTER COLUMN i SET NOT NULL;

删除非 NULL 约束

ALTER TABLE integers
ALTER COLUMN i DROP NOT NULL;

重命名表

ALTER TABLE integers
RENAME TO integers_old;

重命名表的列

ALTER TABLE integers
RENAME i TO ii;

向表的列添加主键

ALTER TABLE integers
ADD PRIMARY KEY (i);

语法

ALTER TABLE 会更改现有表的架构。ALTER TABLE 所做的所有更改都完全遵循事务语义,即在提交之前,这些更改对其他事务不可见,并且可以通过回滚完全撤消。

RENAME TABLE (重命名表)

重命名表

ALTER TABLE integers
RENAME TO integers_old;

RENAME TO 子句用于重命名整个表,从而更改其在架构中的名称。请注意,任何依赖于该表的视图都不会被自动更新。

RENAME COLUMN (重命名列)

要重命名表的列,请使用 RENAMERENAME COLUMN 子句

ALTER TABLE integers 
RENAME COLUMN i TO j;
ALTER TABLE integers
RENAME i TO j;

RENAME [COLUMN] 子句用于重命名表中的单个列。任何依赖于此名称的约束(例如 CHECK 约束)都会自动更新。但是,请注意,任何依赖于此列名称的视图都不会被自动更新。

ADD COLUMN (添加列)

要添加表的列,请使用 ADDADD COLUMN 子句。

例如,向表 integers 添加一个名为 k 的新列,它将填充默认值 NULL

ALTER TABLE integers
ADD COLUMN k INTEGER;

ALTER TABLE integers
ADD k INTEGER;

向表 integers 添加一个名为 l 的新列,它将填充默认值 10

ALTER TABLE integers
ADD COLUMN l INTEGER DEFAULT 10;

ADD [COLUMN] 子句可用于向表添加指定类型的新列。新列将填充指定的默认值,如果未指定,则填充 NULL

DROP COLUMN (删除列)

要删除表的列,请使用 DROPDROP COLUMN 子句

例如,从表 integers 中删除列 k

ALTER TABLE integers
DROP COLUMN k;

ALTER TABLE integers
DROP k;

DROP [COLUMN] 子句可用于从表中删除列。请注意,只有在没有任何索引依赖于列的情况下才能将其删除。这包括作为 PRIMARY KEYUNIQUE 约束的一部分创建的任何索引。属于多列检查约束一部分的列也不能被删除。如果您尝试删除带有索引的列,DuckDB 将返回以下错误消息

Dependency Error:
Cannot alter entry "..." because there are entries that depend on it.

[SET [DATA]] TYPE

使用标准转换将列 i 的类型更改为 VARCHAR 类型

ALTER TABLE integers
ALTER i TYPE VARCHAR;

除了 ALTER column_name TYPE type 之外,您还可以使用等效的 ALTER column_name SET TYPE typeALTER column_name SET DATA TYPE type 子句。

使用指定的表达式转换每一行的数据,将列 i 的类型更改为 VARCHAR 类型

ALTER TABLE integers
ALTER i SET DATA TYPE VARCHAR USING concat(i, '_', j);

[SET [DATA]] TYPE 子句用于更改表中列的类型。列中存在的任何数据都会根据 USING 子句中提供的表达式进行转换;如果缺少 USING 子句,则转换为新数据类型。请注意,只有在没有任何索引依赖于列且列不属于任何 CHECK 约束的情况下,才能更改列的类型。

处理结构体 (Structs)

有两种选项可以更改 STRUCT 类型列的子架构。

使用 struct_insertALTER TABLE

您可以将 ALTER TABLEstruct_insert 函数配合使用。例如

CREATE TABLE tbl (col STRUCT(i INTEGER));
ALTER TABLE tbl
ALTER col TYPE USING struct_insert(col, a := 42, b := NULL::VARCHAR);

使用 ADD COLUMN / DROP COLUMN / RENAME COLUMNALTER TABLE

从 DuckDB v1.3.0 开始,ALTER TABLE 支持使用 ADD COLUMNDROP COLUMNRENAME COLUMN 子句来更新 STRUCT 的子架构。

SET / DROP DEFAULT

设置列的默认值

ALTER TABLE integers
ALTER COLUMN i SET DEFAULT 10;

删除列的默认值

ALTER TABLE integers
ALTER COLUMN i DROP DEFAULT;

SET/DROP DEFAULT 子句用于修改现有列的 DEFAULT 值。请注意,这不会修改列中的任何现有数据。删除默认值等同于将默认值设置为 NULL。

警告:目前,如果存在任何依赖项,DuckDB 将不允许您修改表。这意味着如果您在列上有索引,则需要先删除索引,修改表,然后再重新创建索引。否则,您将收到 Dependency Error(依赖项错误)。

ADD PRIMARY KEY (添加主键)

向表的列添加主键

ALTER TABLE integers
ADD PRIMARY KEY (i);

向表的多个列添加主键

ALTER TABLE integers
ADD PRIMARY KEY (i, j);

ADD / DROP CONSTRAINT

DuckDB 尚不支持 ADD CONSTRAINTDROP CONSTRAINT 子句。

限制

如果表中曾经出现过冲突类型的值(即使它们已被删除),ALTER COLUMN 将会失败

CREATE TABLE tbl (col VARCHAR);

INSERT INTO tbl
VALUES ('asdf'), ('42');

DELETE FROM tbl
WHERE col = 'asdf';

ALTER TABLE tbl
ALTER COLUMN col TYPE INTEGER;
Conversion Error:
Could not convert string 'asdf' to INT32

目前,这是预期行为。作为解决方法,您可以创建一个表副本。

CREATE OR REPLACE TABLE tbl AS FROM tbl;
© 2025 DuckDB 基金会,阿姆斯特丹,荷兰
行为准则 商标使用指南