⌘+k ctrl+k
1.3 (稳定版)
搜索快捷键 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;

删除 NOT-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 所做的所有更改都完全遵守事务语义,即在提交之前对其他事务不可见,并且可以通过回滚完全恢复。

重命名表

重命名表

ALTER TABLE integers
RENAME TO integers_old;

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

重命名列

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

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

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

添加列

要添加表的列,请使用 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

删除列

要删除表的列,请使用 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 约束时,才能更改其类型。

处理结构体

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

使用 struct_insertALTER TABLE

您可以使用 ALTER TABLE 配合 struct_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(依赖错误)。

添加主键

向表的列添加主键

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;