電子書籍の厳選無料作品が豊富!

プログラム素人です。
初心者なのでこんなテーブルを思いつくのですが、これってカラムをいちいち作らないといけないので後のメンテが大変な気がします


CREATE TABLE hoge(
id INT PRIMARY KEY,
item1 VARCHAR(255),
value1 INT,
item2 VARCHAR(255),
value2 INT,
item3 VARCHAR(255),
value3 INT
);

こんな感じのテーブルにどんどんINSERTしていきたいのです

CREATE TABLE hoge(
id INT PRIMARY KEY,
item VARCHAR(255),
value INT
);

聞きたいこと
MYSQL側
IDにPRIMARY KEYが付いているのですが2つ同じPRIMARY KEYはINSERTでききませんよね?どうすればいいでしょうか?

perl側
IDごとにまとめて取得して配列に入れる方法はありますか?
idが1のアイテムを全部取得して配列に入れる方法がわかりません(他にいい方法があったらお願いします)

よろしくお願いします

A 回答 (3件)

なんかidの使い方に強い違和感がありますが、



> IDにPRIMARY KEYが付いているのですが2つ同じPRIMARY KEYはINSERTでききませんよね?どうすればいいでしょうか?

primary keyにしなければよいのでは?
CREATE TABLE hoge(
id INT,
item VARCHAR(255),
value INT
);

> IDごとにまとめて取得して配列に入れる方法はありますか?

whereつきでselect文を発行すれば特定のidのものだけを取得出来ます。
select * from hoge where id = '1';

例えば、こんな感じ?
my $id = 1;
my $rows = $dbh->selectall_arrayref('select * from hoge where id = ?', {Columns=>{id=>undef, item=>undef, value=>undef}}, $id);

prepare、executeのスタイルを取りたいならこういう書き方もありですが。
sub GetRows {
my ($dbh, $id) = @_;
my $sth = $dbh->prepare('select * from hoge where id = ?');
$sth->execute($id);
my @rows = ();
while (my $row = $sth->fetchrow_hashref()) {
push(@rows, $row);
}
$sth->finish;
return \@rows;
}

余談ですが、idというのは普通identityやidentificationの略で、固有の番号を示すのに使われると思うので、それで2つ以上のものが取得できるというのはちょっと違和感があります。idというよりむしろgroup_idなのでは。
groupで共通する内容はgroupのテーブルを作ってそこに入れ、group_idはgroupのテーブルのidを指す外部キーにしそうなものですが。
    • good
    • 0
この回答へのお礼

お答え頂きありがとうございます

>whereつきでselect文を発行すれば特定のidのものだけを取得出来ます。
whereで指定した場合id全部取得できるんですね。1つしかできないと勘違いしていました

>prepare、executeのスタイルを取りたいならこういう書き方もありですが。
すっごい勉強になりました。

>groupのテーブルを作ってそこに入れ、group_idはgroupのテーブルのidを指す外部キーにする
idでやったことをgroup_idでやればいいのでしょうか?この場合idの意味ってありますか?ちなみにidは登録者番号です

CREATE TABLE group(
id INT PRIMARY KEY,
group_id INT,
item VARCHAR(255),
value INT
);

お礼日時:2013/05/02 15:25

> whereで指定した場合id全部取得できるんですね。

1つしかできないと勘違いしていました

PerlのDBIについての説明にざっと目を通しておくと良いかもしれません。
http://dbi.perl.org/
http://search.cpan.org/~timb/DBI/DBI.pm

また、"Perl DBI"で検索すると様々な方の解説記事を見つけられます。公式ドキュメントを読んでもピンと来ない場合は検索してみましょう。

> idでやったことをgroup_idでやればいいのでしょうか?この場合idの意味ってありますか?ちなみにidは登録者番号です

基本的にそういうことです。ただ、登録者番号ならregistrant_idなどと名付けるのでは。

行ごとに固有の番号が振ってあると、その行のデータを指定して取り扱うときになにかと便利だと思います。普通に考えて、データの複数ページにわたる表示、削除や変更をする場合、idがあったほうが楽ではありませんか。
例えば、Webのフォームなどで登録者IDごとにデータの一覧表示をして、削除するものをそこから選ぶ場合、IDさえフォームから送ってもらえると削除するものが一意に決まり、簡単に削除出来ますよね。また、IDで整列して表示すれば複数ページにわたっる表示が必要な場合に簡単に重複なく次のページを表示できます。
    • good
    • 0
この回答へのお礼

丁寧な回答ありがとうございました
いろいろ勉強になりました

勉強不足なのを痛感しましたのでmysqlの本を買うことのしました。

お礼日時:2013/05/04 22:47

上のhogeテーブルと下のhogeテーブルの相関関係がわかりません


同じものなのか、別の処理をしたいのか
もう少し具体的な例を書いて、結果としてどういう集計を想定しているかによって
テーブルの設計はかわってくると思います

ちなみにプログラム初心者とのことですがperlが前提なのでしょうか?
    • good
    • 0
この回答へのお礼

テーブルはこれから作るところです

相関関係はなにもありません、例として表示しました

登録IDごとに、登録したアイテムを効率的にまとめて取得したいだけです

今回はperlです

お礼日時:2013/05/03 02:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!