- 安装
- 文档
- 入门
- 连接
- 数据导入与导出
- 湖仓格式
- 客户端 API
- 概览
- 第三方客户端
- ADBC
- C
- C++
- CLI
- Dart
- Go
- Java (JDBC)
- Julia
- Node.js (已弃用)
- Node.js (Neo)
- ODBC
- PHP
- Python
- R
- Rust
- Swift
- Wasm
- SQL
- 介绍
- 语句
- 概览
- ANALYZE
- ALTER TABLE
- ALTER VIEW
- ATTACH 和 DETACH
- CALL
- CHECKPOINT
- COMMENT ON
- COPY
- CREATE INDEX
- CREATE MACRO
- CREATE SCHEMA
- CREATE SECRET
- CREATE SEQUENCE
- CREATE TABLE
- CREATE VIEW
- CREATE TYPE
- DELETE
- DESCRIBE
- DROP
- EXPORT 和 IMPORT DATABASE
- INSERT
- LOAD / INSTALL
- MERGE INTO
- PIVOT
- 性能分析
- SELECT
- SET / RESET
- SET VARIABLE
- SHOW 与 SHOW DATABASES
- SUMMARIZE
- 事务管理
- UNPIVOT
- UPDATE
- USE
- VACUUM
- 查询语法
- SELECT
- FROM 和 JOIN
- WHERE
- GROUP BY
- GROUPING SETS
- HAVING
- ORDER BY
- LIMIT 和 OFFSET
- SAMPLE
- 展开嵌套
- WITH
- WINDOW
- QUALIFY
- VALUES
- FILTER
- 集合操作
- 预处理语句
- 数据类型
- 表达式
- 函数
- 概览
- 聚合函数
- 数组函数
- 位字符串函数
- Blob 函数
- 日期格式化函数
- 日期函数
- 日期部分函数
- 枚举函数
- 间隔函数
- Lambda 函数
- 列表函数
- 映射函数
- 嵌套函数
- 数值函数
- 模式匹配
- 正则表达式
- 结构体函数
- 文本函数
- 时间函数
- 时间戳函数
- 带时区时间戳函数
- 联合函数
- 实用函数
- 窗口函数
- 约束
- 索引
- 元查询
- DuckDB 的 SQL 方言
- 示例
- 配置
- 扩展
- 核心扩展
- 概览
- 自动补全
- Avro
- AWS
- Azure
- Delta
- DuckLake
- 编码
- Excel
- 全文搜索
- httpfs (HTTP 和 S3)
- Iceberg
- ICU
- inet
- jemalloc
- Lance
- MySQL
- PostgreSQL
- 空间
- SQLite
- TPC-DS
- TPC-H
- UI
- Unity Catalog
- Vortex
- VSS
- 指南
- 概览
- 数据查看器
- 数据库集成
- 文件格式
- 概览
- CSV 导入
- CSV 导出
- 直接读取文件
- Excel 导入
- Excel 导出
- JSON 导入
- JSON 导出
- Parquet 导入
- Parquet 导出
- 查询 Parquet 文件
- 使用 file: 协议访问文件
- 网络和云存储
- 概览
- HTTP Parquet 导入
- S3 Parquet 导入
- S3 Parquet 导出
- S3 Iceberg 导入
- S3 Express One
- GCS 导入
- Cloudflare R2 导入
- 通过 HTTPS / S3 使用 DuckDB
- Fastly 对象存储导入
- 元查询
- ODBC
- 性能
- Python
- 安装
- 执行 SQL
- Jupyter Notebooks
- marimo Notebooks
- Pandas 上的 SQL
- 从 Pandas 导入
- 导出到 Pandas
- 从 Numpy 导入
- 导出到 Numpy
- Arrow 上的 SQL
- 从 Arrow 导入
- 导出到 Arrow
- Pandas 上的关系型 API
- 多个 Python 线程
- 与 Ibis 集成
- 与 Polars 集成
- 使用 fsspec 文件系统
- SQL 编辑器
- SQL 功能
- 代码片段
- 故障排除
- 术语表
- 离线浏览
- 操作手册
- 概览
- DuckDB 的占用空间
- 安装 DuckDB
- 日志
- 保护 DuckDB 安全
- 非确定性行为
- 限制
- DuckDB Docker 容器
- 开发
- 内部结构
- 站点地图
- 在线演示
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 (重命名列)
要重命名表的列,请使用 RENAME 或 RENAME COLUMN 子句
ALTER TABLE integers
RENAME COLUMN i TO j;
ALTER TABLE integers
RENAME i TO j;
RENAME [COLUMN] 子句用于重命名表中的单个列。任何依赖于此名称的约束(例如 CHECK 约束)都会自动更新。但是,请注意,任何依赖于此列名称的视图都不会被自动更新。
ADD COLUMN (添加列)
要添加表的列,请使用 ADD 或 ADD 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 (删除列)
要删除表的列,请使用 DROP 或 DROP COLUMN 子句
例如,从表 integers 中删除列 k
ALTER TABLE integers
DROP COLUMN k;
或
ALTER TABLE integers
DROP k;
DROP [COLUMN] 子句可用于从表中删除列。请注意,只有在没有任何索引依赖于列的情况下才能将其删除。这包括作为 PRIMARY KEY 或 UNIQUE 约束的一部分创建的任何索引。属于多列检查约束一部分的列也不能被删除。如果您尝试删除带有索引的列,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 type和ALTER 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_insert 的 ALTER 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 COLUMN 的 ALTER TABLE
从 DuckDB v1.3.0 开始,ALTER TABLE 支持使用 ADD COLUMN、DROP COLUMN 和 RENAME 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 CONSTRAINT和DROP 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;