テーブルに対してALTER TABLE文でデータ型を変更したりする場合、
必ずバックアップを取得しておかないと後戻り出来ない場合があります。
作業の際は細心の注意をして対応しましょう。
もしくは、作業の際は以下のようなSQLモードをONにして対応すると安全かもしれません。

——————————————————————-
STRICT_TRANS_TABLES
STRICT_ALL_TABLES
——————————————————————-

SQLモードの確認は以下のようなQUERYにて確認出来ます。

mysql> SELECT @@global.sql_mode;
+---------------------+
| @@global.sql_mode |
+---------------------+
| NO_AUTO_CREATE_USER |
+---------------------+
1 row in set (0.00 sec)

mysql> SELECT @@session.sql_mode;
+--------------------+
| @@session.sql_mode |
+--------------------+
| STRICT_ALL_TABLES |
+--------------------+
1 row in set (0.00 sec)

mysql>

alter_table5


mysql> CREATE TABLE `T_ALTER` (
-> `number` int NULL DEFAULT NULL,
-> `comment` varchar(100) NULL DEFAULT NULL
-> ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.07 sec)

mysql> desc T_ALTER;
+---------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| number | int(11) | YES | | NULL | |
| comment | varchar(100) | YES | | NULL | |
+---------+--------------+------+-----+---------+-------+
2 rows in set (0.01 sec)

mysql> insert into T_ALTER values(1000000,'This is test table de su');
Query OK, 1 row affected (0.00 sec)

mysql> insert into T_ALTER values(NULL,NULL);
Query OK, 1 row affected (0.00 sec)

mysql> select * from T_ALTER;
+---------+--------------------------+
| number | comment |
+---------+--------------------------+
| 1000000 | This is test table de su |
| NULL | NULL |
+---------+--------------------------+
2 rows in set (0.00 sec)

mysql>

alter_table

データ型を変更するとどのような影響があるか。。。。


mysql> select * from T_ALTER;
+---------+--------------------------+
| number | comment |
+---------+--------------------------+
| 1000000 | This is test table de su |
| NULL | NULL |
+---------+--------------------------+
2 rows in set (0.00 sec)

mysql> ALTER TABLE T_ALTER
-> MODIFY number TINYINT UNSIGNED NOT NULL,
-> MODIFY comment TINYINT UNSIGNED NOT NULL;
Query OK, 2 rows affected, 4 warnings (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 3

mysql> show warnings;
+---------+------+-----------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+-----------------------------------------------------------------------------------+
| Warning | 1264 | Out of range value for column 'number' at row 1 |
| Warning | 1366 | Incorrect integer value: 'This is test table de su' for column 'comment' at row 1 |
| Warning | 1265 | Data truncated for column 'number' at row 2 |
| Warning | 1265 | Data truncated for column 'comment' at row 2 |
+---------+------+-----------------------------------------------------------------------------------+
4 rows in set (0.00 sec)

mysql> select * from T_ALTER;
+--------+---------+
| number | comment |
+--------+---------+
| 255 | 0 | <----- TINYINT UNSIGNEDのMAX値に置き換えられてしまった。 | 0 | 0 | +--------+---------+ 2 rows in set (0.00 sec) mysql>

alter_table2

再度テーブルの定義を直して見てもデータは戻らない。。。。
本番環境のデータベースであればリストアが必要だ。。。


mysql> select * from T_ALTER;
+--------+---------+
| number | comment |
+--------+---------+
| 255 | 0 |
| 0 | 0 |
+--------+---------+
2 rows in set (0.00 sec)

mysql> ALTER TABLE T_ALTER
-> MODIFY number int NULL DEFAULT NULL,
-> MODIFY comment varchar(100) NULL DEFAULT NULL;
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0

mysql> select * from T_ALTER;
+--------+---------+
| number | comment |
+--------+---------+
| 255 | 0 |
| 0 | 0 |
+--------+---------+
2 rows in set (0.00 sec)

mysql>

alter_table3

失敗したくないときは、自分の作業セッションでStrict Modeを有効にすると良いかもしれません。
4.2.6. SQL モード


mysql> SET @@session.sql_mode = 'STRICT_ALL_TABLES';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @@session.sql_mode;
+--------------------+
| @@session.sql_mode |
+--------------------+
| STRICT_ALL_TABLES |
+--------------------+
1 row in set (0.00 sec)

mysql> CREATE TABLE `T_ALTER` (
-> `number` int NULL DEFAULT NULL,
-> `comment` varchar(100) NULL DEFAULT NULL
-> ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.01 sec)

mysql> insert into T_ALTER values(1000000,'This is test table de su');
Query OK, 1 row affected (0.01 sec)

mysql> insert into T_ALTER values(NULL,NULL);
Query OK, 1 row affected (0.00 sec)

mysql> select * from T_ALTER;
+---------+--------------------------+
| number | comment |
+---------+--------------------------+
| 1000000 | This is test table de su |
| NULL | NULL |
+---------+--------------------------+
2 rows in set (0.00 sec)

mysql> ALTER TABLE T_ALTER
-> MODIFY number TINYINT UNSIGNED NOT NULL,
-> MODIFY comment TINYINT UNSIGNED NOT NULL;
ERROR 1264 (22003): Out of range value for column 'number' at row 1
mysql> select * from T_ALTER;
+---------+--------------------------+
| number | comment |
+---------+--------------------------+
| 1000000 | This is test table de su |
| NULL | NULL |
+---------+--------------------------+
2 rows in set (0.00 sec)

mysql>

alter_table4

Comments are closed.

Post Navigation