PHPプログラミング

ベストプラクティス

データベース PDO その4

PDOでテーブルを作成(CREATE TABLE)

  • このエントリーをはてなブックマークに追加

PDOでデータベースにテーブルを作成する方法を、「MySQL」「PostgreSQL」「SQLite」の3種類のデータベースを使って解説します。

目次

  1. #  PDOでテーブルを作成する
  2. #  MySQLへのテーブル作成
  3. #  PostgreSQLへのテーブル作成
  4. #  SQLiteへのテーブル作成

PDOでテーブルを作成する

今回はデータベースにテーブルを作成する方法を解説していきます。
次のような方が対象です。

  • PDOを使ってテーブルを作成する方法を確認したい
  • PDOでMySQL/PostgreSQL/SQLiteにテーブルを作成する方法を確認したい

前提として、3種類のデータベースには全て「test」というデータベースがあり、次のテーブルを作成することとします。

テーブル名:user_list
カラム名 その他
id 整数 主キー
name 文字列
age 整数
registry_datetime 日付(またはタイムスタンプ)

なお、PDOの基本的な紹介については「PDOについて」を、データベースへの接続については「PDOを使ってデータベースへ接続」をご覧ください。

MySQLへのテーブル作成

まずはMySQLデータベースへテーブルを作成していきましょう。

PDOのテーブル作成はSQL「CREATE TABLE」を実行して行います。
SQLを実行するにはqueryメソッドを使用します。

テーブル作成するqueryメソッドの実行例

// テーブル作成のSQLを作成
$sql = 'CREATE TABLE user (
	id INT(11) AUTO_INCREMENT PRIMARY KEY,
	name VARCHAR(20),
	age INT(11),
	registry_datetime DATETIME
) engine=innodb default charset=utf8';

// SQLを実行
$res = $dbh->query($sql);

テーブル作成に成功した場合はPDOStatementオブジェクトを、失敗した場合はbool値のfalseを返します。
上の例では$resに返り値を代入しています。

テーブルを作成するSQLについてはMySQLに合わせた内容となります。
CREATE TABLE」の基本的な構造は他のデータベースと共通ですが、データの「型」や「属性」の指定方法は扱うデータベースによって異なります。

例えば、MySQLでは主キーなどによく自動連番の整数を設定する「AUTO_INCREMENT」を指定することがあります。
しかしこの属性はPostgreSQLやSQLiteでは指定できないため、それぞれのデータベースに有効なSQLへと書き換えて対応します。

実践的なコード

テーブル作成のSQLと実行方法を確認したところで、実際にデータベース接続からテーブル作成を行い、接続解除するまでの流れをみていきましょう。

index.php

<?php

try {
	// DBへ接続
	$dbh = new PDO("mysql:host=127.0.0.1; dbname=test; charset=utf8", 'username', 'password');

	// SQL作成
	$sql = 'CREATE TABLE user (
		id INT(11) AUTO_INCREMENT PRIMARY KEY,
		name VARCHAR(20),
		age INT(11),
		registry_datetime DATETIME
	) engine=innodb default charset=utf8';

	// SQL実行
	$res = $dbh->query($sql);

} catch(PDOException $e) {

	echo $e->getMessage();
	die();
}

// 接続を閉じる
$dbh = null;

成功した時の返り値

object(PDOStatement)#2 (1) { ["queryString"]=> string(167) "CREATE TABLE user_list ( id INT(11) AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20), age INT(11), registry_datetime DATETIME ) engine=innodb default charset=utf8" }

失敗した時の返り値

bool(false)

こちらのコードは次の順番に処理を行っています。

  1. (1)データベースへ接続
  2. (2)テーブル作成のSQLを作成
  3. (3)SQLを実行
  4. (4)接続を解除

try文で囲っていますが、SQLが原因でテーブル作成に失敗した場合はPDOExceptionのエラー(例外)は投げられません。
そのため、テーブル作成の成功/失敗についてはqueryメソッド実行後の$resに入っている値(PDOStatementオブジェクトfalseか)を確認して行います。

以上がMySQLデータベースへのテーブル作成の基本的な流れとなります。

PostgreSQLへのテーブル作成

続いて、PostgreSQLデータベースへテーブルを作成していきましょう。

PDOのテーブル作成する流れはMySQLと全く同じ手順ですが、実行するSQLの内容が異なるため先に解説します。

テーブル作成のSQL

$sql = "CREATE TABLE user_list (
	id serial PRIMARY KEY,
	name varchar(50),
	age int,
	registry_datetime timestamp
)";

PostgreSQLではMySQLの「AUTO_INCREMENT」は指定できないため、代わりに「serial」を指定して自動連番を設定します。
また、日付の型では「datetime」はないため、ここでは「timestamp」を指定。

こちらのSQLを実行していきます。

index.php

<?php

try {
	// DBへ接続
	$dbh = new PDO("pgsql:host=127.0.0.1; dbname=test;", 'username', 'password');

	// SQL作成
	$sql = "CREATE TABLE user_list (
		id serial PRIMARY KEY,
		name varchar(50),
		age int,
		registry_datetime timestamp
	)";

	// SQL実行
	$res = $dbh->query($sql);

} catch(PDOException $e) {

	echo $e->getMessage();
	die();
}

// 接続を閉じる
$dbh = null;

返り値は上記MySQLと全く同じです。

以上がPostgreSQLデータベースへのテーブル作成の流れでした。

SQLiteへのテーブル作成

最後にSQLiteへのテーブル作成方法を解説します。

SQLiteについてもSQLの内容だけが異なるため、先に変更点のみ解説します。

テーブル作成のSQLを確認

$sql = 'CREATE TABLE user_list (
	id INTEGER PRIMARY KEY,
	name TEXT,
	age INT,
	registry_datetime TEXT
)';

SQLiteでは自動連番の整数を設定するには「INTEGER PRIMARY KEY」と指定することで設定可能です。
また、日付型(datedatetime)は存在しないため「text」を指定します。

以上のSQLを次のコードで実行し、テーブルを作成します。

index.php

<?php

try {
	// DBへ接続
	$dbh = new PDO("sqlite:./sqlite/test.sqlite3");

	// SQL作成
	$sql = 'CREATE TABLE user_list (
		id INTEGER PRIMARY KEY,
		name TEXT,
		age INT,
		registry_datetime TEXT
	)';

	// SQL実行
	$res = $dbh->query($sql);

} catch(PDOException $e) {

	echo $e->getMessage();
	die();
}

// 接続を閉じる
$dbh = null;

SQLiteについても返り値は上記2つのデータベースと同様です。

以上、SQLiteデータベースへのテーブル作成の流れでした。

  • このエントリーをはてなブックマークに追加