我们在MySql中有一个表,在该表中我们有一个名为'type'的varchar列。
表有大约5000万条记录。
从日志限制3中选择不同的log_type;
+-------------------+
| type |
+-------------------+
| EMAIL_SENT |
| EMAIL_OPEN |
| AD_CLICKED |
+-------------------+
截至目前,我们有70种不同的类型。将来我们会有更多类型。
现在我们要将此varchar列转换为整数列。
我们想要像下面这样更新
对于EMAIL_SENT我将使用1 对于EMAIL_OPEN,我将使用2 等等
然后结果列将如下
+-------------------+
| type (int) |
+-------------------+
| 1 |
| 2 |
| 3 |
+-------------------+
我们也在更改其他几列,因此我们正在创建新表并从现有表中加载所有值,如下所示
insert into new_table select * from old_table
如何在将值加载到新表时执行此varchar到int转换。
答案 0 :(得分:0)
只需使用巨人case
:
insert into new_table(LogTypeId, . . .)
select (case logtype
when 'EMAIL_SENT' then 1
when 'EMAIL_OPEN' then 2
. . .
end), . . .
from logs;
创建新表的策略比尝试update
现有表更好。
答案 1 :(得分:0)
替代:
ALTER TABLE x MODIFY COLUMN logtype
ENUM('unk', 'EMAIL_SENT', 'EMAIL_OPEN', ...);
这将是一次传递,每列1个字节,仍显示(用于读/写为字符串)等。
create table so36768171 ( logtype VARCHAR(22) );
INSERT INTO so36768171 VALUES ('EMAIL_SENT'),('EMAIL_SENT'),('EMAIL_OPEN'),('junk');
ALTER TABLE so36768171 MODIFY COLUMN logtype ENUM('unk', 'EMAIL_SENT', 'EMAIL_OPEN');
Records: 4 Duplicates: 0 Warnings: 1
show warnings;
+---------+------+----------------------------------------------+
| Level | Code | Message |
+---------+------+----------------------------------------------+
| Warning | 1265 | Data truncated for column 'logtype' at row 4 |
+---------+------+----------------------------------------------+
SELECT logtype, 0+logtype FROM so36768171;
+------------+-----------+
| logtype | 0+logtype |
+------------+-----------+
| EMAIL_SENT | 2 |
| EMAIL_SENT | 2 |
| EMAIL_OPEN | 3 |
| | 0 |
+------------+-----------+
4 rows in set (0.00 sec)