• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:phpでnot null、a_iでテーブル作成)

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

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

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

  • ベストアンサー
  • 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