修改表 #
一、修改概述 #
1.1 可修改内容 #
text
可修改内容:
├── 添加列
├── 删除列
├── 重命名列
├── 修改表选项
└── 修改表属性
1.2 不可修改内容 #
text
不可修改内容:
├── 主键结构
├── 分区键
├── 聚簇列
├── 列数据类型
└── 表名
二、基本语法 #
2.1 ALTER TABLE语法 #
sql
-- 添加列
ALTER TABLE table_name ADD column_name data_type;
-- 删除列
ALTER TABLE table_name DROP column_name;
-- 重命名列
ALTER TABLE table_name RENAME old_name TO new_name;
-- 修改表选项
ALTER TABLE table_name WITH option = value;
三、添加列 #
3.1 添加单列 #
sql
-- 添加单列
ALTER TABLE users ADD age INT;
-- 添加带默认值的列(不支持,使用NULL)
ALTER TABLE users ADD status TEXT; -- 默认NULL
3.2 添加多列 #
sql
-- 添加多列
ALTER TABLE users ADD (
phone TEXT,
address TEXT,
city TEXT
);
3.3 添加集合类型列 #
sql
-- 添加List
ALTER TABLE users ADD tags LIST<TEXT>;
-- 添加Set
ALTER TABLE users ADD emails SET<TEXT>;
-- 添加Map
ALTER TABLE users ADD attributes MAP<TEXT, TEXT>;
-- 添加UDT
ALTER TABLE users ADD profile FROZEN<user_profile>;
3.4 添加列示例 #
sql
-- 原表
CREATE TABLE users (
user_id UUID PRIMARY KEY,
name TEXT,
email TEXT
);
-- 添加多个列
ALTER TABLE users ADD (
phone TEXT,
age INT,
created_at TIMESTAMP,
tags LIST<TEXT>
);
-- 查看修改后的表结构
DESCRIBE TABLE users;
四、删除列 #
4.1 删除单列 #
sql
-- 删除单列
ALTER TABLE users DROP phone;
4.2 删除列注意事项 #
text
删除列注意事项:
├── 删除后数据不可恢复
├── 空间不会立即释放
├── 需要compact释放空间
├── 主键列不可删除
└── 建议先备份数据
4.3 删除列示例 #
sql
-- 查看表结构
DESCRIBE TABLE users;
-- 删除列
ALTER TABLE users DROP tags;
-- 执行compact释放空间
-- nodetool compact keyspace users
五、重命名列 #
5.1 重命名语法 #
sql
-- 重命名单列
ALTER TABLE users RENAME old_name TO new_name;
-- 重命名主键列
ALTER TABLE users RENAME user_id TO id;
5.2 重命名限制 #
text
重命名限制:
├── 只能重命名主键列
├── 不能重命名普通列
├── 新名称不能与现有列重名
└── 不能改变列的数据类型
5.3 重命名示例 #
sql
-- 原表
CREATE TABLE orders (
order_id UUID,
user_id UUID,
order_date TIMESTAMP,
PRIMARY KEY (order_id, user_id)
);
-- 重命名主键列
ALTER TABLE orders RENAME order_id TO id;
-- 重命名聚簇列
ALTER TABLE orders RENAME user_id TO customer_id;
-- 不能重命名普通列
-- ALTER TABLE orders RENAME order_date TO date; -- 错误
六、修改表选项 #
6.1 修改压缩选项 #
sql
-- 修改压缩算法
ALTER TABLE users WITH compression = {
'sstable_compression': 'LZ4Compressor',
'chunk_length_kb': 64
};
-- 禁用压缩
ALTER TABLE users WITH compression = {
'sstable_compression': ''
};
-- 切换压缩算法
ALTER TABLE users WITH compression = {
'sstable_compression': 'ZstdCompressor'
};
6.2 修改压实选项 #
sql
-- 修改压实策略
ALTER TABLE users WITH compaction = {
'class': 'LeveledCompactionStrategy',
'sstable_size_in_mb': 160
};
-- 修改压实参数
ALTER TABLE users WITH compaction = {
'class': 'SizeTieredCompactionStrategy',
'min_threshold': 8,
'max_threshold': 64
};
6.3 修改缓存选项 #
sql
-- 修改缓存设置
ALTER TABLE users WITH caching = {
'keys': 'ALL',
'rows_per_partition': '100'
};
-- 禁用缓存
ALTER TABLE users WITH caching = {
'keys': 'NONE',
'rows_per_partition': 'NONE'
};
6.4 修改其他选项 #
sql
-- 修改GC宽限时间
ALTER TABLE users WITH gc_grace_seconds = 172800;
-- 修改默认TTL
ALTER TABLE users WITH default_time_to_live = 86400;
-- 修改布隆过滤器
ALTER TABLE users WITH bloom_filter_fp_chance = 0.1;
-- 修改表注释
ALTER TABLE users WITH comment = '更新后的用户表';
-- 同时修改多个选项
ALTER TABLE users
WITH comment = '用户信息表'
AND gc_grace_seconds = 864000
AND compression = {'sstable_compression': 'LZ4Compressor'};
七、修改场景示例 #
7.1 添加业务字段 #
sql
-- 原表
CREATE TABLE products (
product_id UUID PRIMARY KEY,
name TEXT,
price DECIMAL
);
-- 业务扩展:添加新字段
ALTER TABLE products ADD (
description TEXT,
category TEXT,
stock INT,
tags SET<TEXT>
);
-- 添加索引支持
CREATE INDEX ON products(category);
7.2 优化表配置 #
sql
-- 原配置
CREATE TABLE logs (
id UUID PRIMARY KEY,
message TEXT
);
-- 优化压缩
ALTER TABLE logs WITH compression = {
'sstable_compression': 'ZstdCompressor',
'compression_level': 3
};
-- 优化压实
ALTER TABLE logs WITH compaction = {
'class': 'TimeWindowCompactionStrategy',
'compaction_window_unit': 'HOURS',
'compaction_window_size': 1
};
-- 设置TTL
ALTER TABLE logs WITH default_time_to_live = 604800;
7.3 表结构调整 #
sql
-- 原表
CREATE TABLE user_sessions (
session_id UUID PRIMARY KEY,
user_id UUID,
data TEXT
);
-- 添加时间戳和过期
ALTER TABLE user_sessions ADD (
created_at TIMESTAMP,
expires_at TIMESTAMP
);
-- 添加状态
ALTER TABLE user_sessions ADD status TEXT;
-- 修改TTL
ALTER TABLE user_sessions WITH default_time_to_live = 3600;
八、查看修改结果 #
8.1 查看表结构 #
sql
-- 查看修改后的表结构
DESCRIBE TABLE users;
-- 查看完整定义
DESCRIBE FULL TABLE users;
8.2 查询系统表 #
sql
-- 查看表列
SELECT column_name, type, kind
FROM system_schema.columns
WHERE keyspace_name = 'my_keyspace'
AND table_name = 'users';
-- 查看表选项
SELECT options
FROM system_schema.tables
WHERE keyspace_name = 'my_keyspace'
AND table_name = 'users';
九、修改注意事项 #
9.1 添加列 #
text
添加列注意事项:
├── 新列默认值为NULL
├── 不影响现有数据
├── 可以添加集合类型
├── 不能添加主键列
└── 添加后立即生效
9.2 删除列 #
text
删除列注意事项:
├── 数据不可恢复
├── 需要compact释放空间
├── 不能删除主键列
├── 删除后可以重新添加
└── 建议先备份数据
9.3 修改选项 #
text
修改选项注意事项:
├── 压缩修改影响新数据
├── 压实修改立即生效
├── TTL修改影响新数据
├── 缓存修改立即生效
└── 建议在低峰期修改
十、常见错误处理 #
10.1 列已存在 #
sql
-- 错误
ALTER TABLE users ADD name TEXT;
-- Error: Column 'name' already exists
-- 解决:检查列是否存在
DESCRIBE TABLE users;
10.2 列不存在 #
sql
-- 错误
ALTER TABLE users DROP nonexistent_column;
-- Error: Column 'nonexistent_column' not found
-- 解决:检查列名
DESCRIBE TABLE users;
10.3 不能修改主键 #
sql
-- 错误:不能添加主键列
ALTER TABLE users ADD new_pk UUID PRIMARY KEY;
-- Error: Cannot add PRIMARY KEY column
-- 错误:不能删除主键列
ALTER TABLE users DROP user_id;
-- Error: Cannot drop PRIMARY KEY column
10.4 不能修改列类型 #
sql
-- 错误:不能修改列类型
ALTER TABLE users ALTER name TYPE VARCHAR;
-- Error: Cannot alter type
-- 解决:创建新列,迁移数据
ALTER TABLE users ADD name_new TEXT;
UPDATE users SET name_new = name;
ALTER TABLE users DROP name;
十一、最佳实践 #
11.1 修改流程 #
text
修改流程:
├── 1. 查看当前表结构
├── 2. 规划修改内容
├── 3. 在测试环境验证
├── 4. 备份重要数据
├── 5. 执行修改
├── 6. 验证修改结果
├── 7. 更新应用代码
└── 8. 监控性能影响
11.2 修改建议 #
| 操作 | 建议 |
|---|---|
| 添加列 | 批量添加减少操作 |
| 删除列 | 先备份再删除 |
| 修改压缩 | 选择合适算法 |
| 修改压实 | 根据场景选择 |
十二、总结 #
修改表要点:
| 操作 | 说明 |
|---|---|
| 添加列 | 立即生效,默认NULL |
| 删除列 | 数据丢失,需compact |
| 重命名 | 只能重命名主键列 |
| 修改选项 | 根据类型生效 |
最佳实践:
- 修改前备份重要数据
- 在测试环境验证
- 批量添加列减少操作
- 删除列后执行compact
- 监控修改后的性能
下一步,让我们学习删除表!
最后更新:2026-03-27