修改表 #

一、修改概述 #

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
重命名 只能重命名主键列
修改选项 根据类型生效

最佳实践:

  1. 修改前备份重要数据
  2. 在测试环境验证
  3. 批量添加列减少操作
  4. 删除列后执行compact
  5. 监控修改后的性能

下一步,让我们学习删除表!

最后更新:2026-03-27