トップ «前の日記(2006-01-27) 最新 次の日記(2006-02-01)» 編集

3 日坊主日記


2006-01-28 [長年日記]

_ [MySQL] enum 要素の変更

MySQL 4.1

 create table t (
 e enum('a','b','c'));

こういう table t があるとします。

 insert into t (e) values ('b');
 insert into t (e) values ('a');
 insert into t (e) values ('b');
 insert into t (e) values ('c');

まあよっつ入れておきます。

さてここで 'b' を 'q' に変更したくなりました。 alter table で直接変更してみましょう。

 mysql> alter table t modify e enum('a','q','c');
 Query OK, 4 rows affected, 2 warnings (0.27 sec)
 Records: 4  Duplicates: 0  Warnings: 2

 mysql> show warnings;
 +---------+------+----------------------------------------+
 | Level   | Code | Message                                |
 +---------+------+----------------------------------------+
 | Warning | 1265 | Data truncated for column 'e' at row 1 |
 | Warning | 1265 | Data truncated for column 'e' at row 3 |
 +---------+------+----------------------------------------+
 2 rows in set (0.00 sec)

 mysql> select * from t;
 +------+
 | e    |
 +------+
 |      |
 | a    |
 |      |
 | c    |
 +------+
 4 rows in set (0.00 sec)

消えてしまいます。

 mysql> update t set e='b' where e='';
 mysql> select * from t;
 +------+
 | e    |
 +------+
 | b    |
 | a    |
 | b    |
 | c    |
 +------+
 4 rows in set (0.00 sec)

ではどうすればいいかというと、古い要素を残したまま新しい要素を追加して、データを変更し、その後古い要素を削ればいいみたいです。

 mysql> alter table t modify e enum('a','b','c','q');
 Query OK, 4 rows affected (0.27 sec)
 Records: 4  Duplicates: 0  Warnings: 0

 mysql> update t set e='q' where e='b';
 Query OK, 2 rows affected (0.08 sec)
 Rows matched: 2  Changed: 2  Warnings: 0

 mysql> select * from t;
 +------+
 | e    |
 +------+
 | q    |
 | a    |
 | q    |
 | c    |
 +------+
 4 rows in set (0.00 sec)

 mysql> alter table t modify e enum('a','q','c');
 Query OK, 4 rows affected (0.27 sec)
 Records: 4  Duplicates: 0  Warnings: 0

set も同じだと思われます。

本日のツッコミ(全2件) [ツッコミを入れる]
# Visitor220 (2007-10-03 01:25)

I have visited your site 885-times

# Visitor249 (2007-10-03 01:25)

I could not find this site in the Search Engines index

[]