我想在不更改名称的情况下将列的类型从TIME
数据类型SMALL
更改为自午夜以来的秒数为 int。
我有一个进行此更改的 select 语句,但我想知道是否有一种方法可以直接更改数据类型而不创建临时字段。
select ROUND(convert(begin_time, UNSIGNED)/100) % 100 +
60 * ROUND(convert(begin_time, UNSIGNED)/10000) from time_window;
我不认为你可以像这样一次性更改架构和数据。这并不是说您不能以原子方式进行操作——您可以根据您的存储引擎使用事务。但是您将不得不分步执行此操作。
1)更改旧列的名称。
ALTER TABLE time_window CHANGE COLUMN begin_time begin_time_old TIME;
2)SMALL
使用该列的旧名称添加一个新类型的列来存储新数据。
ALTER TABLE time_window ADD COLUMN begin_time SMALL;
3)使用您的转换插入数据。
UPDATE time_window
SET begin_time = ROUND(convert(begin_time_old, UNSIGNED)/100) % 100 +
60 * ROUND(convert(begin_time_old, UNSIGNED)/10000)
4)删除旧列。
ALTER TABLE time_window DROP COLUMN begin_time_old