单条SQL命令中能否对同一列执行多个ALTER修改操作
问题结论
你写的这段语法是错误的,不同数据库对ALTER TABLE的多操作支持规则并不统一,没有通用的跨库写法,以下按主流数据库分别说明可行方案:
不同数据库的实现方式
PostgreSQL
PostgreSQL支持在单个
ALTER TABLE中并列多个子操作,但你写的语法缺少子句分隔、顺序逻辑也不对。修改类型、加非空约束、重命名是三个独立子句,要分开用逗号分隔,且重命名要放在所有对原列名的操作之后,否则改完名之后前面的子句就找不到原列了,正确写法如下:ALTER TABLE tb_table ALTER COLUMN colum_date SET DATA TYPE TIMESTAMP, ALTER COLUMN colum_date SET NOT NULL, RENAME COLUMN colum_date TO colum_timestamp;MySQL
MySQL 8.0及以上版本默认不支持在同一个
ALTER TABLE里同时对同一列执行改类型+重命名操作,需要拆成两条语句执行:-- 第一步修改字段类型和非空约束 ALTER TABLE tb_table MODIFY COLUMN colum_date TIMESTAMP NOT NULL; -- 第二步重命名字段 ALTER TABLE tb_table RENAME COLUMN colum_date TO colum_timestamp;如果你用的是MySQL 8.0之前的版本,可以用
CHANGE语法直接一步同时修改字段名、类型和约束:-- MySQL 5.7及更早版本支持的一步完成写法 ALTER TABLE tb_table CHANGE COLUMN colum_date colum_timestamp TIMESTAMP NOT NULL;SQL Server
SQL Server不支持在同一个
ALTER TABLE中同时修改列类型和重命名,需要拆成两步执行,重命名要调用系统存储过程:-- 修改字段类型和非空约束 ALTER TABLE tb_table ALTER COLUMN colum_date DATETIME NOT NULL; -- 重命名字段 EXEC sp_rename 'tb_table.colum_date', 'colum_timestamp', 'COLUMN';
注意事项
不管使用哪种数据库,修改字段类型前都建议先备份表数据,避免类型转换过程中出现数据丢失、截断或者格式不兼容的问题。
内容的提问来源于stack exchange,提问作者KlauRau
相关产品推荐
相关产品推荐

