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();
}
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というようにするというのはちょっとおかしいかな?と思いました。
PRIMARY KEYを設定したら、table作ることできました。
IF NOT EXISTSでテーブルを作成する件ですが、PHPから色々とMySQLを操作する練習をしていまして、やろうと思いました。
実際に使用する際は、プログラム側でtableは作らないようにいたします。
ありがとうございます。
ついでなのですが、create tableするときに、テーブルと特定のカラムのデフォルトエンコードをutf-8に設定する方法を教えていただければありがたいです。
よろしくお願いします。
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を適宜設定してください
そうでないと想定とちがうものがヒットしたり、ヒットしなかったりすることになるでしょう
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
この回答への補足
ありがとうございます。
教えていただいたやり方で成功しました。
COLLATEというのが、何の設定か教えていただけると幸いです。
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な属性が必要です。
通常オートインクリメントする理由はレコードへ一意なアクセスをするためですので
プライマリーキーとして処理するのが妥当です。
文法エラーまで表示するのであれば、エラーモードの設定までする件ありがとうございます。
オートインクリメントするカラムには最低でもuniqueな属性が必要なんですね。
いろいろと詳しくありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL `picture` varchar(255) のコマンドで間違いないでしょうか? 1 2022/11/21 04:08
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
- MySQL あと、MySQLの文字コードはutf8 気になりますね 1 2022/12/01 07:22
- MySQL my_itemsテーブルのIDにAUTO_INCREMENT を追加ができるかで 1 2023/01/03 09:09
- MySQL エラー 1068 (42000): 複数の主キーが定義されていますエラー 2 2022/11/17 04:36
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- MySQL MySQLのテーブル作成で 自信がありません。 2 2022/08/28 05:35
- MySQL テーブル作成です。どこかのスペルが間違っているか記号など スペースかな? 1 2022/10/01 05:08
- MySQL PHP 画像のアップロード Qiita 2 2022/11/28 04:44
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テーブル名が可変の場合のクエ...
-
テーブル所有者、スキーマ所有...
-
下記の問合せを行うクエリを、P...
-
#1062 - '0' は索引 'PRIMARY' ...
-
my_itemsテーブルのIDにAUTO_IN...
-
SQLです。こんな感じですか?あ...
-
mysqlがインストールされている...
-
sqlにおけるテーブル名と各カラ...
-
php テーブルを作れない
-
SQLiteについて
-
下記の問合せを行うクエリを、P...
-
書籍の内容はまともでしょうか?
-
はもうダメですか?
-
MySQL NULLだけをカウントして...
-
SQL文のエラー
-
htmlコードで書かれた表にphpで...
-
`picture` varchar(255) のコマ...
-
参考書に従って入力したつもり...
-
SQLでカラムを追加し、条件に合...
-
PHPで「myql関数」が使用できな...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Null値が入れられない
-
nullと同じく空白をCountしない...
-
NULLを含む列の足し算
-
MySQLの特定のカラムの内容を全...
-
SQLでLIMIT句を入れるとエラー...
-
テーブル作成時に、「`id` int(...
-
MySQLで関連したデータを横に並...
-
SQL文を入力したらエラー
-
phpでnot null、a_iでテーブル作成
-
phpとSQLで複数条件で検索する...
-
VIEWに対してWHERE句をつける
-
空白文字を含む文字列データの検索
-
sqlの中で、 例えば条件句で AN...
-
JOIN使ってないのに、JOIN操作...
-
SQL任意に並び替えをしたい
-
コマンドプロンプト 複数の実...
-
SELECT文の二段重ね
-
複数の条件がある場合のsqlの書...
-
SQLのエイリアス
-
Mysql 同一テーブルの複数「別...
おすすめ情報