PHPでnot null, auto_incrementのテーブルを作成する方法

このQ&Aのポイント
  • PHPを使用してデータベースに接続し、存在しない場合にテーブルを作成する方法を教えてください。
  • テーブル作成時にカラム名がnoでint型のnot null, auto_increment属性を持つ1つ目のカラムと、カラム名がnameでnot null属性を持つ2つ目のカラムを作成したいです。
  • 上記のソースを使用してテーブルが正しく作成されない場合、どのように修正すればよいですか?
回答を見る
  • ベストアンサー

phpでnot null、a_iでテーブル作成

PHPで、以下のようなソースで、存在しているデータベースtestに接続し、もしない場合、name_listというテーブルを作り、1カラム目をカラム名がnoで、int型でnot null auto_incrementにして、2カラム目をカラム名がnameで、not nullで作りたいのですが、うまくテーブルが作られません。 どうすればうまく作られるか教えてください。 <?php try{ $pdo = new PDO('mysql:dbname=test; host=localhost; charset=utf8', 'root'); $st = $pdo->prepare("create table if not exists name_list (no int(100) not null auto_increment, name varchar(100) not null);"); $st->execute(); }catch(PDOException $e){ print('Error:'.$e->getMessage()); die(); }

  • h_mp
  • お礼率97% (67/69)
  • MySQL
  • 回答数5
  • ありがとう数12

質問者が選んだベストアンサー

  • ベストアンサー
  • ONEONE
  • ベストアンサー率48% (279/575)
回答No.1

PRIMARY KEYを設定してください。 create table if not exists name_list (no int(100) not null auto_increment PRIMARY KEY, name varchar(100) not null) ところで、、、 以前、create table if not existsというクエリを流せばいいと回答しましたが、 サーバサイドで動かしているプログラムは基本的にテーブルありきで実装すると思います。 ですからIF NOT EXISTSというようにするというのはちょっとおかしいかな?と思いました。

h_mp
質問者

お礼

PRIMARY KEYを設定したら、table作ることできました。 IF NOT EXISTSでテーブルを作成する件ですが、PHPから色々とMySQLを操作する練習をしていまして、やろうと思いました。 実際に使用する際は、プログラム側でtableは作らないようにいたします。 ありがとうございます。 ついでなのですが、create tableするときに、テーブルと特定のカラムのデフォルトエンコードをutf-8に設定する方法を教えていただければありがたいです。 よろしくお願いします。

その他の回答 (4)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.5

1点補足 utf8_unicode_ciの場合、半角全角の違いや、濁音半濁音の違いなども 吸収してしまうので注意してください。 半角「a」で検索して全角「A」がヒットしたり、 濁音「ば」で検索して「は、ぱ」やカタカナ「ハ、バ、パ」や半角「ハ」が (※この掲示板だと勝手に変換されるので半角にみえませんが) ヒットしたりします。 またLIKEを使うと微妙にヒットする値が違ったりするのも要注意です。

h_mp
質問者

お礼

utf8_unicode_ciについての詳しいご説明ありがとうございます。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

>COLLATEというのが、何の設定か教えていただけると幸いです。 文字コード(キャラクターセット)に対して、マッチさせるブレを調整する属性です。 文字コードはUTFだったりシフトJISだったりEUC(UJIS)だったりするアレです。 検索する際には、たとえば英字だったら大文字小文字を同じとみるか違うとみるか 日本語だったらひらがなとカタカナを同じとみるか違うとみるか調整できます。 以下サンプル //元データ作成 create table tbl ( id int not null auto_increment primary key ,data_gen varchar(100) character set utf8 collate utf8_general_ci ,data_uni varchar(100) character set utf8 collate utf8_unicode_ci ,data_bin varchar(100) character set utf8 collate utf8_bin ) engine = innodb default character set utf8 COLLATE utf8_general_ci; insert into tbl(id,data_gen,data_uni,data_bin) values(1,'aaa','aaa','aaa') ,(2,'AAA','AAA','AAA') ,(3,'あああ','あああ','あああ') ,(4,'アアア','アアア','アアア'); //以下検索 select * from tbl where data_gen='aaa';//→1,2がヒット select * from tbl where data_uni='aaa';//→1,2がヒット select * from tbl where data_bin='aaa';//→1のみヒット //generalやunicodeは英字のブレを吸収し、binは厳密に比較します。 select * from tbl where data_gen='あああ';//→3のみヒット select * from tbl where data_uni='あああ';//→3,4がヒット select * from tbl where data_bin='あああ';//→3のみヒット //unicodeは日本語のブレを吸収し、generalやbinは厳密に比較します。 どれが優秀ということではなく、用途によってcollateを適宜設定してください そうでないと想定とちがうものがヒットしたり、ヒットしなかったりすることになるでしょう

h_mp
質問者

お礼

とても詳しいご説明ありがとうございます。 大変よくわかりました。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

>create tableするときに、テーブルと特定のカラムのデフォルトエンコードをutf-8に設定する方法 hogehoge varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci を指定してあげてください COLLATEはutf8_unicode_ciでもよいでしょう(拡張方法が若干違う) 総じてこんな感じ create table if not exists name_list ( no int(100) not null auto_increment PRIMARY KEY , name varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci not null) engine = innodb DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci

h_mp
質問者

お礼

ありがとうございます。

h_mp
質問者

補足

ありがとうございます。 教えていただいたやり方で成功しました。 COLLATEというのが、何の設定か教えていただけると幸いです。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

PDOでtry~catchでエラーを拾うのは通常は接続エラーだけです。 SQLの文法エラーは無視されるのでcatchに処理がながれません。 文法エラーが拾いたければエラーモードの設定までしてください <?php try{ $dsn = 'mysql:host=localhost; dbname=test'; $user = 'root'; $password = '・・・・'; $pdo = new PDO($dsn, $user,$password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $query="create table if not exists name_list (`no` int(100) not null auto_increment, `name` varchar(100) not null);"; $st = $pdo->query($query); }catch(PDOException $e){ die($e->getMessage()); } ?> テーブル作るのにプリペアド処理はいらないので普通にquery()を実行すればいいでしょう 上記だとエラーが表示されるはずです。 エラー内容については#1さんが指摘の通り、オートインクリメントするカラムには 最低でもuniqueな属性が必要です。 通常オートインクリメントする理由はレコードへ一意なアクセスをするためですので プライマリーキーとして処理するのが妥当です。

h_mp
質問者

お礼

文法エラーまで表示するのであれば、エラーモードの設定までする件ありがとうございます。 オートインクリメントするカラムには最低でもuniqueな属性が必要なんですね。 いろいろと詳しくありがとうございます。

関連するQ&A

  • ODBC経由でMySQL5.0に auto_increment属性などを付加したテーブルを作成したい

    ODBC経由でMySQL5.0に auto_increment属性など付加した以下のテーブルを作成したいのですがODBCのSQL文はどう書けばよいのでしょうか? DROP TABLE IF EXISTS test; CREATE TABLE IF NOT EXISTS test ( a1 int(11) NOT NULL auto_increment, b1 enum('public','group','private') NOT NULL default 'public', c1 date NOT NULL default '0000-00-00', d1 mediumtext NOT NULL, PRIMARY KEY (`a1`) ) TYPE=MyISAM AUTO_INCREMENT=1 ; よろしくお願いします。

  • mySQLでのテーブル作成についての質問

    テーブル内の列で Field || Type || Null || Key || Default || Extra ID | int(6) | YES | UNI | NULL | auto_increment と言うテーブルを作成するにはどう記述したら良いのでしょうか? auto_incrementを指定した場合はフィールドにNULLを許可する事は出来ないのでしょうか?

  • C言語にて構造体のメンバがNULLであるかを判定するサンプルを作成して

    C言語にて構造体のメンバがNULLであるかを判定するサンプルを作成しています。 一応目的の動作はするのですが、プログラミングとして正しいか教えて頂ければと 思います。 <test.c> int main() { /* ---------------------------------------- */ /* 構造体のメンバ(NULL保障無し)がNULLか */ /* 比較するサンプル */ /* ---------------------------------------- */ char buf[50]; /* サンプル構造体 */ struct ST_test { int cd; char name[10]; int no; }; struct ST_test st_test; /* 構造体定義 */ memset(&st_test,0x00,sizeof(st_test)); /* 構造体初期化 */ memset(&buf[0],0x00,sizeof(buf)); /* 構造体初期化 */ /* 構造体に値セット */ st_test.cd = 12; memcpy(&st_test.name[0],"aabbccddee",sizeof(st_test.name)); st_test.no = 999; /* NULL判定 */ if(*st_test.name == 0x00) { printf("NULLです\n"); } else { printf("NULLではないです\n"); } return (0); }

  • DBでAUTO_INCREMENTのフィールドの最新の数値を知るには

    PHP+MySQLで開発しています。 自らがDBテーブルに書き込んだレコードの、AUTO_INCREMENT指定してある項目に設定された数値を取得したいのですが、どのようにすればいいのでしょうか。 DB指定 CREATE TABLE test( no INT NOT NULL AUTO_INCREMENT, comment TEXT, PRIMARY KEY(no) ); PHP書き込み $sql = "INSERT INTO test(comment)VALUES('いろは')"; $results = mysql_query($sql,$dbid); このとき、テーブルtestのフィールドnoに設定された数値を知るために、 今はわざわざSQL select MAX(no) from test を発行しています。 これですと、確実性に欠けますし、冗長な気がします。 他に何か効率的な方法があるような気がしますので、 質問いたしました。 よろしくお願い申し上げます。

    • ベストアンサー
    • PHP
  • テーブルのフィールドにNot null制約を付けたい

    お世話になります。 既存テーブルにフィールドを追加する方法は わかっているのですが、その追加したフィールドに not null制約を付けるにはどのようなコマンドを 実行する必要があるのでしょうか。 ↓のコマンドには制約をつけるオプションはないですよね。。 ALTER TABLE テーブル名 ADD (カラム名 カラム定義) よろしくお願いします。

  • SQLite(3.2.2)でauto_increment

    今、SQLiteを利用してつまづいています。 バージョンは3.2.2です。(Linux) MySQL、PostgreSQLの知識はあります。 プライマリーキー(id)にシリアルを作成しようと思い、http://cl.pocari.org/2006-02-12-1.html を参考にしながらテーブルを作りました。 CREATE TABLE bbs ( id INTEGER UNSIGNED NOT NULL PRIMARY KEY, name VARCHAR(255) NOT NULL, message TEXT NOT NULL, last_update TIMESTAMP NOT NULL ); このbbsテーブルに対し、 INSERT INTO bbs (name,message,last_update) VALUES ('name','message','2008-04-03 12:11:00'); というクエリを発行すると 「SQL error: bbs.id may not be NULL」 とういエラーが返ってきます。 確かに、bbsテーブルのidカラムは「NOT NULL」制約があるのでエラーが正しいとは思うのですが、参考URLのauto_incrementの作成方法には、auto_incrementにしたいカラムをPRIMARY KEYでやればできる、のような事が書いてあったので、よく分かりません。 バージョンの問題なのか、クエリに誤りがあるのか分かる方おられましたら解答お願いします。 また、auto_incrementなカラムの作成方法も一緒に教えていただけたら幸いです。 宜しくお願いします。

  • NOT NULL制約カラムにNULLが格納される

    SQLite3でテーブル作成する際、カラムをテキスト型にして、NOT NULL制約をつけているのですが、NULLも普通にINSERTされてしまいます なんででしょうか?

  • PostgreSQLの「not null」制約の追加

    こんにちは。いつもお世話になります。 PostgreSQLのversion7.2.8で、「not null」制約の追加、削除の方法をおたずねします。よろしくお願いします。 ALTER TABLE テーブル名 ALTER COLUMN カラム名 SET NOT NULL; で試したところ、syntaxエラー(構文エラー)で失敗。 ALTER TABLE テーブル名 ALTER COLUMN カラム名 DROP NOT NULL; で試してみても、同じくsyntaxエラーです。 version7.2.8が原因でしょうか? また、version7.2.8でも「not null」制約の追加、削除が できる他の方法はありますでしょうか? テーブルを作り直さずに、 既存のテーブルのカラムへの制約の追加、削除をしようとしています。 よろしくお願いします。

  • インポートした時に[ _seq ]というテーブルが自動作成される

    お世話になっております。 MySQLのPHPMyAdminにてSQLをインポートすると、 まれに[ _seq ]というテーブルが自動作成される事があります。 構成として、 sequence int(11) Not Null auto_increment の1フィールドのみのテーブルです。 何故、このようなテーブルが発生するのでしょうか? また、インポートデータに問題はないのでしょうか? (インポート時にエラーは表示されません) どうぞ宜しくお願い致します。

  • phpのADOで作成したdbを表示したい

    すみません、前回mysqlでデータベースを作成しようとしていたのですが、古いということで ADOを利用したデータベースの作成をしてみました。 コマンドプロンプトにて mysql> show fields from test_tb; +----------------+-----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------------+-----------+------+-----+---------+-------+ | 企業コード | char(8) | YES | | NULL | | | 会社名 | char(16) | YES | | NULL | | | 雇用形態コード | char(3) | YES | | NULL | | | 職種コード | char(6) | YES | | NULL | | | 仕事内容 | char(128) | YES | | NULL | | | 勤務地 | char(32) | YES | | NULL | | | 勤務時間 | char(32) | YES | | NULL | | | 給料 | char(16) | YES | | NULL | | | 待遇 | char(32) | YES | | NULL | | | 休日 | char(32) | YES | | NULL | | | 応募資格 | char(32) | YES | | NULL | | | 採用人数 | int(8) | YES | | NULL | | | 採用プロセス | char(128) | YES | | NULL | | | 面接日 | char(32) | YES | | NULL | | | 採用担当者 | char(32) | YES | | NULL | | | 担当者から一言 | char(64) | YES | | NULL | | | 連絡先 | char(16) | YES | | NULL | | | ウェブサイト | char(64) | YES | | NULL | | | 条件属性 | char(8) | YES | | NULL | | +----------------+-----------+------+-----+---------+-------+ というテーブルを作成したのですが、実際にブラウザで表示させてみると データベースに接続できませんでした。SQLSTATE[HY000] [1049] Unknown database 'test_tb' となってしまいます。 サンプルはサイトからそのままコピーしています。 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>サンプル</title> </head> <body> <?php try { $pdo = new PDO('mysql:dbname=test_tb;host=localhost', '***', '******'); } catch (PDOException $e) { exit('データベースに接続できませんでした。' . $e->getMessage()); } $stmt = $pdo->query('SET NAMES utf8'); if (!$stmt) { $info = $pdo->errorInfo(); exit($info[2]); } $stmt = $pdo->query('SELECT * FROM address WHERE no >= 10 AND no <= 20'); if (!$stmt) { $info = $pdo->errorInfo(); exit($info[2]); } while ($data = $stmt->fetch(PDO::FETCH_ASSOC)) { echo '<p>' . $data['no'] . ':' . $data['name'] . "</p>\n"; } $pdo = null; ?> </body> </html> 原因がわかりません。教えていただきたいです。

    • ベストアンサー
    • PHP