ALTER TABLE tbl_name ADD COLUMN col_name column_definition [FIRST | AFTER col_name]; ALTER TABLE tbl_name ADD COLUMN (col_name column_definition,...); ALTER TABLE tbl_name ADD {INDEX|KEY} [index_name] (col_name,...); ALTER TABLE tbl_name ADD {PRIMARY KEY|UNIQUE} [index_name] (col_name,...); ALTER TABLE tbl_name DROP COLUMN col_name; ALTER TABLE tbl_name DROP INDEX index_name;
添加列
使用ALTER TABLE ADD COLUMN来添加新列到表中。例如:ALTER TABLE users ADD COLUMN email VARCHAR(100); 这会在users表中添加一个email列,默认添加到表末尾。如果想指定位置,可以用FIRST或AFTER:ALTER TABLE users ADD COLUMN phone VARCHAR(20) AFTER name;
删除列
删除列用DROP COLUMN:ALTER TABLE users DROP COLUMN phone; 注意,这会永久删除列及其数据,先备份很重要。
修改列定义
ALTER TABLE users MODIFY COLUMN email VARCHAR(150) NOT NULL; 这改变了email列的长度和允许空值。或者用CHANGE来改名:ALTER TABLE users CHANGE COLUMN old_email new_email VARCHAR(100);
添加主键
ALTER TABLE users ADD PRIMARY KEY (id); 如果id已是主键列,这会设置它为主键。
删除主键
ALTER TABLE users DROP PRIMARY KEY; 注意,删除主键后可能需要重建其他索引。
添加索引
ALTER TABLE users ADD INDEX idx_name (name); 或唯一索引:ALTER TABLE users ADD UNIQUE INDEX idx_email (email);
修改表名
ALTER TABLE old_table RENAME TO new_table; 简单重命名表。
实战示例:重构用户表
假设有users表,想添加列、改类型、加索引:ALTER TABLE users ADD COLUMN created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP; ALTER TABLE users MODIFY COLUMN age INT NOT NULL; ALTER TABLE users ADD INDEX idx_age (age);
FAQ
Q: ALTER TABLE会锁表吗?
A: 是的,大多数操作会锁表,影响并发,高峰期慎用。
Q: 如何避免数据丢失?
A: 先备份表:CREATE TABLE users_backup AS SELECT * FROM users;
Q: 可以一次改多列吗?
A: 可以,用逗号分隔:ALTER TABLE users ADD COLUMN col1 INT, MODIFY COLUMN col2 VARCHAR(50);
Q: InnoDB和MyISAM区别?
A: InnoDB支持在线DDL,MyISAM更快但锁表更久。