0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【MySQL】カラム定義を変更する際の注意点

Last updated at Posted at 2025-05-25

はじめに

ALTER TABLE MODIFY文でカラム定義を変更した際に、元の定義が削除されてしまったので、その原因と対処法について調べた内容まとめます。

結論

  • ALTER TABLE MODIFY(またはCHANGE)でカラム定義を変更すると、新しい定義で上書きされる
  • 元からあった定義は引き継がれない

CHANGE または MODIFY を使用してカラム定義を変更する場合、PRIMARY KEY や UNIQUE などのインデックス属性以外の、新しいカラムに適用するデータ型およびすべての属性を定義に含める必要があります。 元の定義には存在するが、新しい定義として指定されていない属性は引き継がれません。

  • 変更前:employeesテーブルのdepartment_nameカラムに下記の定義がある状態
    • varchar(10)
    • 非NULL制約 あり
    • default値は"temp"
mysql> DESC employees;
+-----------------+--------------+------+-----+---------+----------------+
| Field           | Type         | Null | Key | Default | Extra          |
+-----------------+--------------+------+-----+---------+----------------+
| department_name | varchar(10)  | NO   |     | temp    |                |
  • varchar(5)に変更するMODIFY文を実行
mysql> ALTER TABLE employees modify COLUMN department_name varchar(5);
  • 変更後
    • varchar(5)
    • 非NULL制約 なし  # 元の定義が削除された状態
    • default値 なし # 元の定義が削除された状態
mysql> DESC employees;
 +-----------------+--------------+------+-----+---------+----------------+
 | Field           | Type         | Null | Key | Default | Extra          |
 +-----------------+--------------+------+-----+---------+------------
-| department_name | varchar(10)  | NO   |     | temp    |                |
+| department_name | varchar(5)   | YES  |     | NULL    |                |

対処法

  • ALTER TABLE MODIFYでカラム定義を変更する際は、元の定義も含めて実行する
  • ALTER TABLE MODIFYで設定できない定義は、ALTER TABLE MODIFY実行後に再設定する

  • varchar(5)に変更するMODIFY文に元からの定義である NOT NULL を含めて実行する
- mysql> ALTER TABLE employees modify COLUMN department_name varchar(5);
+ mysql> ALTER TABLE employees modify COLUMN department_name varchar(5) NOT NULL;
  • ALTER TABLE MODIFY文で設定しなかったdefault設定は削除される
mysql> DESC employees;
 +-----------------+--------------+------+-----+---------+----------------+
 | Field           | Type         | Null | Key | Default | Extra          |
 +-----------------+--------------+------+-----+---------+----------------+
-| department_name | varchar(10)  | NO   |     | temp    |                |
+| department_name | varchar(5)   | NO   |     | NULL    |                |
  • default設定を再設定する
mysql> ALTER TABLE employees ALTER department_name SET DEFAULT "temp";
mysql> DESC employees;
 +-----------------+--------------+------+-----+---------+----------------+
 | Field           | Type         | Null | Key | Default | Extra          |
 +-----------------+--------------+------+-----+---------+----------------+
-| department_name | varchar(5)   | NO   |     | NULL    |                |
+| department_name | varchar(5)   | NO   |     | temp    |                |

追記

  • 非NULL制約を設定する
ALTER TABLE テーブル名 MODIFY COLUMN カラム名 データ型名 NOT NULL;
  • 非NULL制約を解除する
ALTER TABLE テーブル名 MODIFY COLUMN カラム名 データ型名;
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?