【SQL】CREATE DATABASEでデータベースを作成する方法|文字コード・権限・IF NOT EXISTS・RDBMS別の違い

【SQL】CREATE DATABASEでデータベースを作成する方法|文字コード・権限・IF NOT EXISTS・RDBMS別の違い SQL

データベースの作成は、システム開発の最初のステップです。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を指定し忘れると、後から変更するのが大変になります。

関連記事