SQLのalterについてまとめています。
サンプルSQLでは、MySQL8.0.18を使用しています。
SQLのalterは、既存のデータベースオブジェクトを変更する
alterは、データベースオブジェクトの特性を変更するDDL(データ定義言語)の命令です。SQL92の標準規格として定義されています。
【関連記事】
▶SQLとはどういうもの? 独自拡張と標準SQLの大きな違いって、何?
一般的に、以下の構文で使用します。既存のデータベース、テーブル、ユーザなどの属性を変更します。
alter オブジェクト種類 オブジェクト名 パラメータ
alter database データベースを変更する
データベースのキャラクターセットや照合順序(COLLATION)を変更できます。
以下のSQLでは、以下をおこなっています。
- show databasesで現在のデータベース一覧を確認
- データベース testdbを作成
- testdbの属性情報を取得
- alter databseで、キャラクターセットをsjisに、照合順序をsjis_japanese_ciに変更
- 変更後のtestdbの属性情報を取得
mysql> show databases; +--------------------+ | Database | +--------------------+ | employees | | information_schema | | mysql | | performance_schema | | sys | | testdb | +--------------------+ 6 rows in set (0.16 sec) mysql> show create database testdb; +----------+----------------------------------------------------------------------------------------------------------------------------------+ | Database | Create Database | +----------+----------------------------------------------------------------------------------------------------------------------------------+ | testdb | CREATE DATABASE `testdb` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */ | +----------+----------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> select * from information_schema.schemata where schema_name='testdb'; +--------------+-------------+----------------------------+------------------------+----------+--------------------+ | CATALOG_NAME | SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | SQL_PATH | DEFAULT_ENCRYPTION | +--------------+-------------+----------------------------+------------------------+----------+--------------------+ | def | testdb | utf8mb4 | utf8mb4_0900_ai_ci | NULL | NO | +--------------+-------------+----------------------------+------------------------+----------+--------------------+ 1 row in set (0.00 sec) mysql> alter database testdb character set sjis collate sjis_japanese_ci; Query OK, 1 row affected (0.04 sec) mysql> select * from information_schema.schemata where schema_name='testdb'; +--------------+-------------+----------------------------+------------------------+----------+--------------------+ | CATALOG_NAME | SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | SQL_PATH | DEFAULT_ENCRYPTION | +--------------+-------------+----------------------------+------------------------+----------+--------------------+ | def | testdb | sjis | sjis_japanese_ci | NULL | NO | +--------------+-------------+----------------------------+------------------------+----------+--------------------+ 1 row in set (0.00 sec)
alter table テーブルを変更する
既存のテーブルの属性を変更します。
以下のSQLでは、テーブルemployees2のカラムhire_dateの後ろに、新しいカラムcol1 varchar(10)を追加し、descで追加後のテーブルカラム一覧を確認しています。
mysql> alter table employees2 add col1 varchar(10) after hire_date; Query OK, 0 rows affected (0.06 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> desc employees2; +------------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+---------------+------+-----+---------+-------+ | emp_no | int | NO | PRI | NULL | | | birth_date | date | NO | | NULL | | | first_name | varchar(14) | NO | | NULL | | | last_name | varchar(16) | NO | | NULL | | | gender | enum('M','F') | NO | | NULL | | | hire_date | date | NO | | NULL | | | col1 | varchar(10) | YES | | NULL | | +------------+---------------+------+-----+---------+-------+
【関連記事】
▶SQL ALTER TABLEのサンプルSQL データベース製品によって、機能拡張が異なる
alter user ユーザを変更する
既存のユーザ情報を変更します。
下記は、既存のユーザ一覧を確認し、ユーザ user0@localhostのパスワードを「password1」に変更しています。
mysql> select user,host from mysql.user; +------------------+-----------+ | user | host | +------------------+-----------+ | root | % | | user1 | % | | departments_only | localhost | | mysql.infoschema | localhost | | mysql.session | localhost | | mysql.sys | localhost | | root | localhost | | select_only | localhost | | user0 | localhost | +------------------+-----------+ mysql> alter user 'user0'@'localhost' identified by 'password1'; Query OK, 0 rows affected (0.01 sec)
【関連記事】
▶MySQLのユーザ一覧は、mysql.userを参照 権限一覧やパスワードハッシュ一覧の取得方法
まとめ
- SQLのalterは既存のデータベースオブジェクトを変更する
- alter tableはデータベースの属性を変更する。
- alter tableはデータベーステーブルの属性、カラムを変更する。
- alter userはユーザの属性を変更する。パスワードの変更も可能。