- 安装
- 文档
- 入门
- 连接
- 数据导入
- 概览
- 数据源
- CSV 文件
- JSON 文件
- 多个文件
- Parquet 文件
- 分区
- Appender(追加器)
- INSERT 语句
- 客户端 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
- PIVOT
- 性能分析
- SELECT
- SET / RESET
- SET VARIABLE
- 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
- MySQL
- PostgreSQL
- 空间
- SQLite
- TPC-DS
- TPC-H
- UI
- 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
- 行为准则
- 发布日历
- 路线图
- 站点地图
- 在线演示
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
子句用于重命名整个表,更改其在模式中的名称。请注意,依赖于该表的任何视图都不会自动更新。
重命名列
要重命名表的列,请使用 RENAME
或 RENAME COLUMN
子句
ALTER TABLE integers
RENAME COLUMN i TO j;
ALTER TABLE integers
RENAME i TO j;
RENAME [COLUMN]
子句用于重命名表中的单个列。依赖于此名称的任何约束(例如,CHECK
约束)都会自动更新。但是,请注意,依赖于此列名的任何视图都不会自动更新。
添加列
要添加表的列,请使用 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
或 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
约束时,才能更改其类型。
处理结构体
有两种选项可以更改 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
(依赖错误)。
添加主键
向表的列添加主键
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;