PR

【MySQL】modify column時に、既存の設定内容の削除に注意する

MySQL
記事内に広告が含まれています。

MySQLのmodify columnを使用する際には既存の設定内容を削除しないように注意する必要があります。
この記事では実際のNG例を出しながら説明します。

環境

  • MySQL: 8.0.28

用意するテーブルとカラム設定

以下のようなテーブルとカラムを用意しておきます。

testテーブルに、idnameのカラムを持たせています。

mysql> show create table test;
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                            |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------+
| test  | CREATE TABLE `test` (
  `id` int DEFAULT NULL COMMENT 'ID',
  `name` varchar(256) DEFAULT NULL COMMENT '名前'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3   |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

問題が発生する例

例えば、nameにnot null制約を追加したいとします。

alter table test modify column name varchar(256) not null;

上記のSQLを使用して、not null制約を追加することはできましたが、commentが削除されてしまいました。

mysql> show create table test;
+-------+------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                       |
+-------+------------------------------------------------------------------------------------------------------------------------------------+
| test  | CREATE TABLE `test` (
  `id` int DEFAULT NULL COMMENT 'ID',
  `name` varchar(256) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 |
+-------+------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

対策

既存の他の設定内容も追加するようにしましょう。

設定内容を確認する際は、これまで使用しているshow create tableや以下のshow full columnsを使用することができます。
※not null制約を付与する前のカラム状態を表示しています。

mysql> show full columns from test;
+-------+--------------+-----------------+------+-----+---------+-------+---------------------------------+---------+
| Field | Type         | Collation       | Null | Key | Default | Extra | Privileges                      | Comment |
+-------+--------------+-----------------+------+-----+---------+-------+---------------------------------+---------+
| id    | int          | NULL            | YES  |     | NULL    |       | select,insert,update,references | ID      |
| name  | varchar(256) | utf8_general_ci | YES  |     | NULL    |       | select,insert,update,references | 名前    |
+-------+--------------+-----------------+------+-----+---------+-------+---------------------------------+---------+
2 rows in set (0.01 sec)

今度は、commentの設定を忘れないようにalter tableを記述します。

alter table test modify column name varchar(256) not null comment '名前';

上記のalter table文を使用した結果、commentが削除されずにnot null制約を付与できていることが確認できます。

mysql> show create table test;
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                        |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------+
| test  | CREATE TABLE `test` (
  `id` int DEFAULT NULL COMMENT 'ID',
  `name` varchar(256) NOT NULL COMMENT '名前'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3   |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

まとめ

modify column時に注意すべき点に関して説明しました。
既存の設定内容は記載を忘れがちな部分かと思いますので、変更した後の確認も含めて気を付けるようにしましょう。

コメント

タイトルとURLをコピーしました