我希望在不改变名称的情况下,将列的类型从TIME
数据类型更改为SMALL
int,其秒数为秒。
我有一个select语句进行此更改,但我想知道是否有办法直接更改数据类型而不创建临时字段。
select ROUND(convert(begin_time, UNSIGNED)/100) % 100 +
60 * ROUND(convert(begin_time, UNSIGNED)/10000) from time_window;
答案 0 :(得分:1)
我认为你不能像这样一举改变架构和数据。这并不是说你不能原子地 - 你可以根据你的存储引擎使用一个事务。但是你将不得不分步进行。
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