Migrating data from a boolean column to a varchar column My table currently has a boolean column, let's call it the "important" column, reflecting whether a record is urgent or not. I want to transition to using a varchar column that reflects a record's urgency as one of a few possible values, like "normal", "urgent", "extreme". The column name needs to change to, so I'm planning on doing something like this: create a new column called "urgency" to hold the normal/urgent/extreme value, and selectively migrate the existing boolean date into the new column.

Is this a good approach, and are there any gotchas I should watch out for?
In MySQL, the BOOLEAN data type does not really exist. If you create something like this:

mysql&gt; CREATE TABLE imp (id int PRIMARY KEY auto_increment, important BOOLEAN);
Query OK, 0 rows affected (0.01 sec)

mysql&gt; 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


You will see that BOOLEAN is just an alias for tinyint(1):

mysql&gt; 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 |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+


And you can even insert a 2 value:

mysql&gt; INSERT INTO imp (important) VALUES (2);
Query OK, 1 row affected (0.00 sec)

mysql&gt; SELECT * FROM imp WHERE important = 2;
+----+-----------+
| id | important |
+----+-----------+
| 13 |         2 |
+----+-----------+
1 row in set (0.00 sec)


The less traumatic way, but more secure and flexible that I can think is, instead of creating an enum or a string, reuse the column and set a foreign key if you are using InnoDB:

mysql&gt; CREATE TABLE levels (id tinyint primary key, name varchar(30));
Query OK, 0 rows affected (0.01 sec)

mysql&gt; 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&gt; 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


That way you cannot insert values that do not exist on the levels table and you can add values later very easily (also, you do not have to rebuild the original table).