PHPプログラミング

最終更新日:
公開日:

レシピ

データベース PDO

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

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

この記事のポイント

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

目次

PDOでテーブルを作成する

今回はデータベースにテーブルを作成する方法を解説していきます。

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

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

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

MySQL / MariaDBのデータベースにテーブルを作成

まずはMySQLとMariaDBのデータベースにテーブルを作成していきましょう。
この2つのデータベースは同じ方法が使用できるためまとめて解説していきます。

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

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

// テーブル作成のSQLを作成
$sql = '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';

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

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

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

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

実践的なコード

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

コード例

<?php

try {
	// (1)データベースへ接続
	$dbh = new PDO("mysql:host=127.0.0.1; dbname=test; charset=utf8", 'username', 'password');

	// (2)テーブル作成のSQLを作成
	$sql = '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';

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

} catch(PDOException $e) {

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

// (4)接続を解除
$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とMariaDBのデータベースにテーブルを作成する基本的な流れとなります。

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をPDOを使って実行していきます。

コード例

<?php

try {
	// (1)データベースへ接続
	$dbh = new PDO("pgsql:host=127.0.0.1; dbname=test;", 'username', 'password');

	// (2)テーブル作成のSQLを作成
	$sql = "CREATE TABLE user_list (
		id serial PRIMARY KEY,
		name varchar(50),
		age int,
		registry_datetime timestamp
	)";

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

} catch(PDOException $e) {

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

// (4)接続を解除
$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を次のコードで実行し、テーブルを作成します。

コード例

<?php

try {
	// (1)データベースへ接続
	$dbh = new PDO("sqlite:./sqlite/test.sqlite3");

	// (2)テーブル作成のSQLを作成
	$sql = 'CREATE TABLE user_list (
		id INTEGER PRIMARY KEY,
		name TEXT,
		age INT,
		registry_datetime TEXT
	)';

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

} catch(PDOException $e) {

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

// (4)接続を解除
$dbh = null;

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

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

こちらの記事は役に立ちましたか?

ありがとうございます。
もしよろしければ、あわせてフィードバックや要望などをご入力ください。

コメントありがとうございます!
運営の参考にさせていただきます。