ivan Asked: 2014-03-17 11:07:36 +0800 CST2014-03-17 11:07:36 +0800 CST 2014-03-17 11:07:36 +0800 CST 将数据从布尔列迁移到 varchar 列 772 我的表目前有一个布尔列,我们称之为“重要”列,反映记录是否紧急。我想过渡到使用反映记录紧迫性的 varchar 列作为几个可能值之一,例如“正常”、“紧急”、“极端”。列名需要更改为,所以我打算做这样的事情:创建一个名为“紧急”的新列来保存正常/紧急/极端值,并有选择地将现有的布尔日期迁移到新列中。 这是一个好方法吗,有什么我应该注意的问题吗? mysql migration 2 个回答 Voted Best Answer jynus 2014-03-17T13:19:25+08:002014-03-17T13:19:25+08:00 在 MySQL 中,BOOLEAN 数据类型并不真正存在。如果你创建这样的东西: mysql> CREATE TABLE imp (id int PRIMARY KEY auto_increment, important BOOLEAN); Query OK, 0 rows affected (0.01 sec) mysql> INSERT INTO imp (important) VALUES (0), (0), (0), (1), (0), (1), (1), (1), (0), (0), (0), (1); Query OK, 12 rows affected (0.00 sec) Records: 12 Duplicates: 0 Warnings: 0 你会看到 BOOLEAN 只是 tinyint(1) 的别名: mysql> SHOW CREATE TABLE imp; +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | imp | CREATE TABLE `imp` ( `id` int(11) NOT NULL AUTO_INCREMENT, `important` tinyint(1) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=latin1 | +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 你甚至可以插入一个 2 值: mysql> INSERT INTO imp (important) VALUES (2); Query OK, 1 row affected (0.00 sec) mysql> SELECT * FROM imp WHERE important = 2; +----+-----------+ | id | important | +----+-----------+ | 13 | 2 | +----+-----------+ 1 row in set (0.00 sec) 我认为创伤较小但更安全和灵活的方法是,如果您使用的是 InnoDB ,请重用列并设置外键,而不是创建枚举或字符串: mysql> CREATE TABLE levels (id tinyint primary key, name varchar(30)); Query OK, 0 rows affected (0.01 sec) mysql> insert into levels values (0, 'normal'), (1, 'urgent'), (2, 'extreme'); Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> ALTER TABLE imp ADD CONSTRAINT important FOREIGN KEY (important) REFERENCES levels(id); Query OK, 13 rows affected (0.02 sec) Records: 13 Duplicates: 0 Warnings: 0 这样您就不能插入不存在于级别表中的值,并且您可以稍后非常轻松地添加值(而且,您不必重建原始表)。 Tero Kilkanen 2014-03-17T11:31:10+08:002014-03-17T11:31:10+08:00 这种方法应该有效。但是,我个人会使用 ENUM 或 TINYINT 作为紧急列的数据类型,它在数据库中占用的空间更少。
在 MySQL 中,BOOLEAN 数据类型并不真正存在。如果你创建这样的东西:
你会看到 BOOLEAN 只是 tinyint(1) 的别名:
你甚至可以插入一个 2 值:
我认为创伤较小但更安全和灵活的方法是,如果您使用的是 InnoDB ,请重用列并设置外键,而不是创建枚举或字符串:
这样您就不能插入不存在于级别表中的值,并且您可以稍后非常轻松地添加值(而且,您不必重建原始表)。
这种方法应该有效。但是,我个人会使用 ENUM 或 TINYINT 作为紧急列的数据类型,它在数据库中占用的空间更少。