将MySQL CHAR(1)列转换为TINTINT

时间:2015-09-04 12:02:34

标签: mysql

作为一个引导程序,我想说我是一个PHP程序员 - 并且没有比该角色更需要的SQL。

我继承了一个带有遗留结构的表,该结构使用CHAR(1),其值为'Y'或空白(即'')以表示真和假。

我宁愿将列类型设为TINYINT,1表示true,0表示false。 (布尔 - 我想要布尔。)我想部分原因是因为PHP使得转换1和0变为真和假更容易。 'Y'v。''需要更多的逻辑而不是我满意,最终有人会忘记他们实际上并不是布尔并造成混乱。

到目前为止,这是我的方法:

  1. 为我正在尝试删除的每个旧列添加一个新列。
  2. 使用MySQL的IF结构来适当地填充我的新(TINYINT)列
  3. 杀死旧列并在其位置重命名新列
  4. 这些列在任何地方充当外键,我完全与其他系统隔离,所以不用担心。我的问题有两方面:

    首先,这是最好的方法吗?在我看来,可能有更好的方法来做到这一点。是否可以更改当前列中的值,然后更改其类型而不会丢失我的数据?

    其次,如果我在正确的轨道上,如何将此SELECT IF(strcmp(hardware.USER_HARDWARE_REQUEST, 'Y'), 0, 1) FROM hardware;转换为更新以将该值存储在另一列中?

2 个答案:

答案 0 :(得分:1)

您也可以使用CASE

SELECT 
    CASE hardware.USER_HARDWARE_REQUEST WHEN 'Y' THEN 0 ELSE 1 END as 'result'     
FROM hardware;

答案 1 :(得分:0)

好吧,我想我已经明白了。我可以继续更新Y /''值为1/0,然后只需更改类型。

查询我最终使用的内容类似于此UPDATE hardware SET SERVER_HARDWARE_REQUEST = (SELECT IF(strcmp(hardware.SERVER_HARDWARE_REQUEST, 'Y'), 0, 1));

然后我可以简单地更改列的类型定义,它就像魔法一样。