みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

同じカラム直下に複数のレコードをinsert

初心者です。
DBの同じカラム直下に複数のレコードをinsertさせるにはどうすればよいかどなたか教えて頂けますでしょうか。

以下は入力フォームで入力した複数の日付を確認画面で受け取ったものです。

<table>
<th>休日年月日</th>
<td>2016/9/12,2016/9/14,2016/9/20,2016/9/26,2016/9/28</td>
</table>

日付が一つでしたらinsertは可能ですが、複数の場合はinsertできませんでした。

複数でinsertした場合のDBのイメージは以下の通りです。

holiday(カラム名)
2016/9/12(レコード1行目)
2016/9/14(レコード2行目)
2016/9/20(レコード3行目)
2016/9/26(レコード4行目)
2016/9/28(レコード5行目)

どなたか教えて頂けたら幸いです。

よろしくお願い致します。

投稿日時 - 2016-06-25 14:53:47

QNo.9192595

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

> では、DBに新たに日付を追加するたびにinsertを手動で一回追加することになりますでしょうか。

手動???
プログラムじゃなくて、コマンドラインとかDB管理ツール使って 自力で入力するってことですか?
そんなことしなくても、No.4のようにすれば プログラム化できますよ。

> 変数などでDBに値が入るたびにinsertを実行するような書き方はありませんでしょうか。
「DBに入るたびにinsertを実行」っていう言い方は 変ですよ、
DBにすでに入っているなら、Insert済ってことになりますので。

もし、PHPの変数に入るたびに、それをDBにInsertする方法方法はありませんか?
っていうことなら、 すでにNo.4回答した通りです。つまり
"日付,日付,日付,.."という文字列の入った変数を、カンマで分割した配列に入れて、
その配列をループで回して、insertを繰り返せばよいことになります。

投稿日時 - 2016-06-27 15:19:17

ANo.4

無理に1回のinsertでやろうとしないで、単純にinsertを繰り返せばいいんでは?
foreach ( split(",", $_POST['holiday']) as $holiday ) {
 //$holidayのSQLインジェクション対策等のセキュリティー対策は省略
 $sql = "insert into calendartbl (holiday) values ('$holiday')";
 $sqlのexec命令;
 エラー処理;
}

どうしても1発の$sql実行でやりたい事情があるなら
"insert into calendartbl (holiday) values ('1つ目のポストされた値'); insert into calendartbl (holiday) values ('2つ目のポストされた値') ; $sql = "insert into calendartbl (holiday) values ('3つ目のポストされた値') ";
って感じの複数のinsert命令を;で連結させたのを作ってから とか。

投稿日時 - 2016-06-26 19:49:56

補足

ご回答、ありがとうございます。
では、DBに新たに日付を追加するたびにinsertを手動で一回追加することになりますでしょうか。
変数などでDBに値が入るたびにinsertを実行するような書き方はありませんでしょうか。

投稿日時 - 2016-06-27 14:45:07

お礼

ご回答、ありがとうございます。

投稿日時 - 2016-06-27 14:44:56

ANo.3

これ以前に寄せられた2つの回答では「DBMSの列にそんな(配列型なんて)概念はないよ」くらいの勢いで答えられているくらいこの配列型の列というのは一般的ではない。
あることはあるしSQL標準(SQL99)にも明記されている。
MySQL(ARRAY型)、PostgreSQL(ARRAY型)、Oracle(VARRAY型)には実装もある。Microsoft SQL Serverには実装されていない(多分)。配列の中身はSTRINGというかVARIANTというか。まぁSTRING(varcharとか)だと思っとけばいいと思う。

MySQLではINSERT文は
insert into hoge_table (id, arrayvalues) values (1, ('2016/9/12','2016/9/14','2016/9/20'));
のように普通の括弧とカンマ区切りを使えば実現できる。SELECTの結果を取り出す方法は言語によりけり。

まぁ、そのくらいある程度DBMSを知っている人にすら知られていないものなので、やはり配列型はあきらめてテーブル構造を
create table holiday (id integer, holidayid integer, dt varchar, constraint pk_holiday primary key(id, holidayid));
のようにして(idというのは顧客IDとか会社IDとかそんな感じになるんだろう)
ほりでーIDとともに日付をセットするようなのが一般的であろう。その方が誰に対しても分かりやすくていいと思うよ。

投稿日時 - 2016-06-26 13:44:21

補足

ご回答、ありがとうございます。ほかの方法も教えてくださって、ありがとうございます。
では、DBに新たに日付を追加するたびにinsertを手動で一回追加することになりますでしょうか。
変数などでDBに値が入るたびにinsertを実行するような書き方はありませんでしょうか。

投稿日時 - 2016-06-27 14:46:40

お礼

ご回答、ありがとうございます。

投稿日時 - 2016-06-27 14:46:43

ANo.2

>DBの同じカラム直下に複数のレコードをinsertさせるにはどうすればよいか

RDBの概念を勉強してから質問してください。

投稿日時 - 2016-06-25 20:14:35

お礼

ご回答ありがとうございました。

投稿日時 - 2016-06-25 21:11:18

ANo.1

>>DBの同じカラム直下に複数のレコードをinsertさせるにはどうすればよいかどなたか教えて頂けますでしょうか。

一般に使われているリレーショナルDBでは、そういうことは仕様的にできません。

別途、日付だけのテーブルを用意して、そっちに複数のデータをinsertする方法になると思います。
そして、1件の親データと、その複数件の子データを連携させて、あたかもひとまとまりのデータに見せるってやり方などで対応します。

データーベースの本を読めば、設計の仕方がいろいろ書かれていると思います。

投稿日時 - 2016-06-25 15:13:03

補足

一行の場合、
「$sql = "insert into calendartbl (holiday) values ('ポストされた値')";」でできますが、複数の場合の書き方もしご存知でしたら教えて頂けたらとおもいます。

投稿日時 - 2016-06-25 15:32:01

お礼

ご回答、ありがとうございます。

投稿日時 - 2016-06-25 15:32:02

あなたにオススメの質問