データベースの作成は、システム開発の最初のステップです。SQLのCREATE DATABASE文を使えば、1行のコマンドで新しいデータベースを作成できます。
この記事では、基本構文から文字コード・照合順序の指定、IF NOT EXISTSによる安全な作成、権限の確認方法、RDBMS別の違いまで、実務で必要な知識を網羅的に解説します。
この記事で学べること
- CREATE DATABASEの基本構文と実行例
- IF NOT EXISTSで既存チェック付きの安全な作成
- 文字コード(UTF-8)と照合順序の指定方法
- データベースの一覧表示・切り替え・削除
- 作成に必要な権限の確認と付与
- MySQL・PostgreSQL・SQL Server・Oracle・SQLiteの違い
- よくあるエラーと対処法
CREATE DATABASEの基本構文
基本構文
CREATE DATABASE データベース名;
実行例
CREATE DATABASE my_database;
実行結果
Query OK, 1 row affected (0.01 sec)
ポイント:データベース名には英数字・アンダースコアが使えます。ハイフン(-)を使いたい場合はバッククォートで囲む必要があります(例: `my-database`)。
IF NOT EXISTSで安全に作成する
既に同名のデータベースが存在するとエラーになります。IF NOT EXISTSを付けると、存在しない場合のみ作成します。
IF NOT EXISTS
-- 既に存在していてもエラーにならない
CREATE DATABASE IF NOT EXISTS my_database;
注意:IF NOT EXISTSはMySQL・PostgreSQL(9.x以降)で使用できます。SQL Serverでは使用できないため、別の方法で存在チェックが必要です(後述)。
文字コードと照合順序を指定する
日本語を正しく扱うには、データベース作成時に文字コード(CHARACTER SET)と照合順序(COLLATE)を指定します。
MySQL
MySQL – UTF-8で作成
CREATE DATABASE my_database
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
| 文字コード |
説明 |
推奨 |
| utf8mb4 |
4バイトUTF-8(絵文字対応) |
推奨 |
| utf8(utf8mb3) |
3バイトUTF-8(絵文字非対応) |
非推奨 |
| latin1 |
西欧言語のみ(日本語非対応) |
非推奨 |
注意:MySQLのutf8は3バイトまでしか対応しないため、絵文字を扱えません。utf8mb4を必ず指定してください。
PostgreSQL
PostgreSQL – UTF-8で作成
CREATE DATABASE my_database
WITH
ENCODING = 'UTF8'
LC_COLLATE = 'ja_JP.UTF-8'
LC_CTYPE = 'ja_JP.UTF-8'
TEMPLATE = template0;
SQL Server
SQL Server – 照合順序を指定
CREATE DATABASE my_database
COLLATE Japanese_CI_AS;
データベースの一覧表示・切り替え・削除
データベース一覧の表示
データベース一覧
-- MySQL
SHOW DATABASES;
-- PostgreSQL
\l
-- または
SELECT datname FROM pg_database;
-- SQL Server
SELECT name FROM sys.databases;
データベースの切り替え(USE)
データベースの切り替え
-- MySQL / SQL Server
USE my_database;
-- PostgreSQL
\c my_database
データベースの削除(DROP DATABASE)
データベースの削除
-- 存在する場合のみ削除
DROP DATABASE IF EXISTS my_database;
注意:DROP DATABASEを実行すると、データベース内のすべてのテーブルとデータが完全に削除されます。本番環境では細心の注意を払ってください。
データベース作成に必要な権限
CREATE DATABASEの実行には、適切な権限が必要です。
| RDBMS |
必要な権限 |
権限の確認方法 |
| MySQL |
CREATE権限 |
SHOW GRANTS; |
| PostgreSQL |
CREATEDB権限 |
\du または SELECT rolcreatedb FROM pg_roles; |
| SQL Server |
CREATE DATABASE権限 |
SELECT HAS_PERMS_BY_NAME(NULL, NULL, 'CREATE ANY DATABASE') |
MySQL – ユーザーに権限を付与
-- CREATE権限を付与
GRANT CREATE ON *.* TO 'username'@'localhost';
FLUSH PRIVILEGES;
RDBMS別の構文比較
| RDBMS |
構文 |
IF NOT EXISTS |
| MySQL |
CREATE DATABASE db CHARACTER SET utf8mb4; |
対応 |
| PostgreSQL |
CREATE DATABASE db WITH ENCODING 'UTF8'; |
9.x以降対応 |
| SQL Server |
CREATE DATABASE db COLLATE Japanese_CI_AS; |
非対応(条件分岐で代替) |
| Oracle |
CREATE DATABASE(DBA権限、通常はDBCAを使用) |
非対応 |
| SQLite |
ファイルを作成 = DB作成 |
不要 |
SQL Serverでの存在チェック
SQL Server – IF NOT EXISTSの代替
IF NOT EXISTS (
SELECT name FROM sys.databases
WHERE name = 'my_database'
)
BEGIN
CREATE DATABASE my_database;
END;
SQLiteの場合
SQLite – ファイル作成がDB作成
# コマンドラインでDBファイルを作成
sqlite3 my_database.db
# ファイルが存在しなければ自動作成される
よくあるエラーと対処法
| エラー |
原因 |
対処法 |
ERROR 1007: Can't create database; database exists |
同名のDBが既に存在 |
IF NOT EXISTSを付ける |
ERROR 1044: Access denied |
CREATE権限がない |
管理者にGRANTで権限付与を依頼 |
ERROR 1253: COLLATION is not valid |
照合順序名が不正 |
SHOW COLLATIONで利用可能な値を確認 |
ERROR 1006: Can't create database (errno: 13) |
ディスク権限の問題 |
データディレクトリの書き込み権限を確認 |
まとめ
| ポイント |
内容 |
| 基本構文 |
CREATE DATABASE データベース名; |
| 安全な作成 |
CREATE DATABASE IF NOT EXISTS データベース名; |
| 文字コード |
MySQLはutf8mb4を必ず指定 |
| 権限 |
CREATE権限(MySQL)/ CREATEDB権限(PostgreSQL)が必要 |
| 削除 |
DROP DATABASE IF EXISTS データベース名;(元に戻せない) |
データベースの作成はシンプルな操作ですが、文字コードの設定を最初に正しく行っておくことが重要です。特にMySQLではutf8mb4を指定し忘れると、後から変更するのが大変になります。
関連記事