@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

Insert文について

1
投稿者投稿内容
フジー
常連さん
会議室デビュー日: 2004/06/03
投稿数: 45
投稿日時: 2004-09-21 15:03
現在VB.NET+ADO.netでWindowsアプリを開発中です。
現在データの追加で悩んでいます。

必須項目ではない項目があり、入力する場合と入力しない場合があります。
そのときの追加時のInsert文をひとつで済ませようとしたのですがエラーが発生します。

例)
テーブル:顧客
電話番号(必須)|顧客名(必須)|顧客名カナ(必須)|住所(任意)|

Insert文
住所も入力された場合
INSERT INTO 顧客(電話番号,顧客名,顧客名カナ,住所)〜

住所未入力の場合
INSERT INTO 顧客(電話番号,顧客名,顧客名カナ)〜

とならないといけないためにエラーが発生すると思います。
流動的にINSERT文を生成しないといけないのでしょうか?
しかし、任意入力の項目が多いため流動的に生成するとパフォーマンスが
かなり落ちます。
ひとつのINSERT文で解決できないでしょうか?よろしくお願いします。

コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2004-09-21 15:18
INSERT INTO 顧客(電話番号,顧客名,顧客名カナ,住所) values ('0352851461', '誰か', 'ダレカ', NULL);

ちょっと、各フィールドの型が不明なのであてずっぽですが、、
「住所」フィールドだけ任意ならば、「住所」フィールドだけ入力が無い場合が想定される
ので、その場合は「住所」フィールドの属性を NULL 可 にして「住所」に該当する値が
得られない場合に NULL を入れて未入力である事を明示すれば良いでしょう。

普通の SQL ならば・・・
CHN
ぬし
会議室デビュー日: 2002/03/07
投稿数: 382
投稿日時: 2004-09-21 15:19
引用:

フジーさんの書き込み (2004-09-21 15:03) より:
現在VB.NET+ADO.netでWindowsアプリを開発中です。
現在データの追加で悩んでいます。

必須項目ではない項目があり、入力する場合と入力しない場合があります。
そのときの追加時のInsert文をひとつで済ませようとしたのですがエラーが発生します。

例)
テーブル:顧客
電話番号(必須)|顧客名(必須)|顧客名カナ(必須)|住所(任意)|

Insert文
住所も入力された場合
INSERT INTO 顧客(電話番号,顧客名,顧客名カナ,住所)〜

住所未入力の場合
INSERT INTO 顧客(電話番号,顧客名,顧客名カナ)〜

とならないといけないためにエラーが発生すると思います。
流動的にINSERT文を生成しないといけないのでしょうか?
しかし、任意入力の項目が多いため流動的に生成するとパフォーマンスが
かなり落ちます。
ひとつのINSERT文で解決できないでしょうか?よろしくお願いします。




肝心な部分書かれてませんので、なんとも言えませんが、
insert文の文法を勉強してみることをお勧めします。

動的に、SQL文の生成でパフォーマンスが落ちるでしょうか?
聞いたことがありません、、、

_________________
フジー
常連さん
会議室デビュー日: 2004/06/03
投稿数: 45
投稿日時: 2004-09-21 15:50
早速の返事ありがとうございます。
すいませんとんだ勘違いをしていました。
Nullを入れることで解決いたしました(^^;

任意項目の場合はINSERT文からはずさないといけないと勝手に思い込んでいました。
失礼しました。
かなり勉強不足なのでSQLの勉強をしたいと思います、、、
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2004-09-21 15:53
>しかし、任意入力の項目が多いため流動的に生成するとパフォーマンスが
>かなり落ちます。

とはSQL文の文字列を生成する処理がボトルネックになるということでしょうか?
StringBuilderクラスを使用すれば、それほどボトルネックにはならないはずです。
どうしても使いたくないなら
あらかじめ全てをの項目をInsert文に指定しておき、
入力されなかった項目だけ
SqlParameterのValueにDBNullを設定すればイイと思います。



未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2004-09-21 16:38
アプリケーション側での未指定項目に null を設定するというのはあまりオススメしません。アプリケーションがデータベースの設計変更に弱くなってしまいますので。

アプリケーション側では設定値は指定しない(ユーザーが入力項目を省略した)、という意味であれば null ではなく default を使用するべきです。

コード:
insert into TABLE (FIELD1, FIELD2, FIELD3) values (1, 2, default) 



と書いた場合、FIELD3 にはスキーマで定義された既定値がセットされます。null をセットする場合でも既定値を null にしておいて、アプリケーションでは default を指定するのが良いと思います。こうしておくと入力省略時に null ではなく '' 空文字をセットしたくなっても、アプリケーションを変更せずにデータベース側で既定値を変更するだけですみます。
フジー
常連さん
会議室デビュー日: 2004/06/03
投稿数: 45
投稿日時: 2004-09-21 17:54
引用:

未記入さんの書き込み (2004-09-21 16:38) より:
アプリケーション側での未指定項目に null を設定するというのはあまりオススメしません。アプリケーションがデータベースの設計変更に弱くなってしまいますので。

アプリケーション側では設定値は指定しない(ユーザーが入力項目を省略した)、という意味であれば null ではなく default を使用するべきです。

コード:
insert into TABLE (FIELD1, FIELD2, FIELD3) values (1, 2, default) 



と書いた場合、FIELD3 にはスキーマで定義された既定値がセットされます。null をセットする場合でも既定値を null にしておいて、アプリケーションでは default を指定するのが良いと思います。こうしておくと入力省略時に null ではなく '' 空文字をセットしたくなっても、アプリケーションを変更せずにデータベース側で既定値を変更するだけですみます。



ご指導ありがとうございます。
この方法は後々変更する場合に都合がいいですね。
この方法を使わせていただきます。ありがとうございます。
フジー
常連さん
会議室デビュー日: 2004/06/03
投稿数: 45
投稿日時: 2004-09-21 17:58
コブラさん、burton999さん、CHNさんご回答ありがとうございます。
とても参考になりました。
SQLに関して勉強不足だったのでとても勉強になりました。
ありがとうございます。


1

スキルアップ/キャリアアップ(JOB@IT)