C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: 別のテーブルの値を別のテーブルに挿入させてから表示したい


(過去ログ 161 を表示中)

[トピック内 13 記事 (1 - 13 表示)]  << 0 >>

■93288 / inTopicNo.1)  別のテーブルの値を別のテーブルに挿入させてから表示したい
  
□投稿者/ 無名 (1回)-(2019/12/03(Tue) 10:12:31)

分類:[データベース全般] 

MySQLを使用しています。

ほんの数か月前に仕事をしながら学んでおります。初心者です。

tbl_data1という元データに新規追加としてtbl_data2の指定したデータを挿入しその結果(tbl_data1)
を画面に表示させたいと考えております。


tbl_data1
+-------------+-----------+--------+-
| 1_id(キー) | setubi_id | .... | ....
+-------------+-----------+--------+-
| 1 | 10 | |
| 2 | 23 | .... | ....
| 3 | 14 | |
| 4 | null | |
+-------------+-----------+--------+-

tbl_data2
+--------------------+-----------+--------+-
| setubi_id 2(キー) | ......... | .... | ....
+--------------------+-----------+--------+-
| 10 | .. | |
| 23 | .. | .... | ....
| 14 | .. | |
| 15 | .. | |
+--------------------+-----------+--------+-
↓実行結果(実装したいこと)

tbl_data1
+-------------+-----------+--------+-
| 1_id(キー) | setubi_id | .... | ....
+-------------+-----------+--------+-
| 1 | 10 | | →画面表示
| 2 | 23 | .... | ....
| 3 | 14 | |
| 4 | 15 | |
+-------------+-----------+--------+-

そこでネットで調べたところ、それらしいのが見つかったので試してみました。

参考URL↓
https://nodoame.net/archives/9054

実際のコード
INSERT INTO tbl_data1(setubi_id )
SELECT setubi_id 2
FROM tbl_data2

実行結果エラーメッセージ
フィールド'1_id'にデフォルト値がありません。

そもそもこのやり方で合っているのか、合っているけど書き方が違うのか分かりません。
説明が下手くそなもので、意味が分からない方もおられると思うのでその際はお手数を
お掛けしますが質問してくださると助かります。

初心者なもので何卒宜しくお願い致します。



引用返信 編集キー/
■93289 / inTopicNo.2)  Re[1]: 別のテーブルの値を別のテーブルに挿入させてから表示したい
□投稿者/ 無名 (2回)-(2019/12/03(Tue) 10:13:31)
表が汚くなってしまいすみません。
引用返信 編集キー/
■93290 / inTopicNo.3)  別のテーブルの値を別のテーブルに挿入させてから表示したい
□投稿者/ ぶなっぷ (214回)-(2019/12/03(Tue) 10:59:45)
2019/12/03(Tue) 11:04:29 編集(投稿者)
MySQLのSQL文法は知らないので、それらしいSQLで話を進めます。
摘便、MySQLのSQL文法に置き換えてね。

まず、tbl_data1.1_id はただの連番かな?
であれば、auto number属性を付けましょう。

その上で、tbl_data2にあって、tbl_data1にないレコードを追加したいのかな?
INSERT INTO だと重複レコードの追加はエラーになるので、省かれるようなSQLを
書きます。

INSERT INTO tbl_data1
SELECT * FROM tbl_data2 LEFT JOIN tbl_data1
ON tbl_data2.setubi_id2 = tbl_data1.setubi_id
WHERE tbl_data1.setubi_id = null

ポイントは外部結合
通常のJOINは双方の結合キーが存在するレコードしか出力されませんが、
外部結合なら、一方しか存在しないレコードも出力されます。
  LEFT JOIN tbl_data1 ON tbl_data2.setubi_id2 = tbl_data1.setubi_id
なので、左側のテーブル tbl_data2 のキー(setubi_id2)のリンク先である
tbl_data1.setubi_id が存在しないレコードも出力されます。

結果として、tbl_data2にしか存在しないレコードだけが、
INSERT INTO tbl_data1 の対象となり、エラーは発生しないはず。
 ※ 実際に動かして試したわけじゃないので、エラーになったらごめん

引用返信 編集キー/
■93291 / inTopicNo.4)  Re[1]: 別のテーブルの値を別のテーブルに挿入させてから表示したい
□投稿者/ 大谷刑部 (74回)-(2019/12/03(Tue) 11:40:09)
No93288 (無名 さん) に返信
> MySQLを使用しています。
>
> 実行結果エラーメッセージ
> フィールド'1_id'にデフォルト値がありません。

キー項目だからでしょ。

↓以下を参照してください
https://qiita.com/jlake/items/b92cf5281216825abe58
引用返信 編集キー/
■93292 / inTopicNo.5)  Re[2]: 別のテーブルの値を別のテーブルに挿入させてから表示したい
□投稿者/ KOZ (61回)-(2019/12/03(Tue) 11:56:04)
No93289 (無名 さん) に返信
> 表が汚くなってしまいすみません。
図表モードに変えると良いですよ。
表を整形してみました。

tbl_data1(更新前)
+-------------+-----------+
| 1_id(キー)  | setubi_id |
+-------------+-----------+
| 1           | 10        |
| 2           | 23        |
| 3           | 14        |
| 4           | null      |
+-------------+-----------+

tbl_data1(更新後)
+-------------+-----------+
| 1_id(キー)  | setubi_id |
+-------------+-----------+
| 1           | 10        |
| 2           | 23        |
| 3           | 14        |
| 4           | 15        |
+-------------+-----------+

UPDATE なのでは?

引用返信 編集キー/
■93293 / inTopicNo.6)  Re[1]: 別のテーブルの値を別のテーブルに挿入させてから表示したい
□投稿者/ WebSurfer (1983回)-(2019/12/03(Tue) 13:29:15)
No93288 (無名 さん) に返信

> そもそもこのやり方で合っているのか、合っているけど書き方が違うのか分かりません。

「やり方」を議論する以前に、何故 tbl_data1 テーブルの setubi_id フィールドが NULL だと、
tbl_data2 テーブルの setubi_id 2 フィールドの 15 の行が該当するのか分からないのですか?

何らかのデフォルト値を決めておいて、NULL の場合はデフォルト値を当てはめるという話なら
分かるのですが。
引用返信 編集キー/
■93316 / inTopicNo.7)  Re[3]: 別のテーブルの値を別のテーブルに挿入させてから表示したい
□投稿者/ 無名 (3回)-(2019/12/04(Wed) 17:14:37)
No93290 (ぶなっぷ さん) に返信
> 2019/12/03(Tue) 11:04:29 編集(投稿者)
>
> MySQLのSQL文法は知らないので、それらしいSQLで話を進めます。
> 摘便、MySQLのSQL文法に置き換えてね。
>
> まず、tbl_data1.1_id はただの連番かな?
> であれば、auto number属性を付けましょう。
>
> その上で、tbl_data2にあって、tbl_data1にないレコードを追加したいのかな?
> INSERT INTO だと重複レコードの追加はエラーになるので、省かれるようなSQLを
> 書きます。
>
> INSERT INTO tbl_data1
> SELECT * FROM tbl_data2 LEFT JOIN tbl_data1
> ON tbl_data2.setubi_id2 = tbl_data1.setubi_id
> WHERE tbl_data1.setubi_id = null
>
> ポイントは外部結合
> 通常のJOINは双方の結合キーが存在するレコードしか出力されませんが、
> 外部結合なら、一方しか存在しないレコードも出力されます。
> LEFT JOIN tbl_data1 ON tbl_data2.setubi_id2 = tbl_data1.setubi_id
> なので、左側のテーブル tbl_data2 のキー(setubi_id2)のリンク先である
> tbl_data1.setubi_id が存在しないレコードも出力されます。
>
> 結果として、tbl_data2にしか存在しないレコードだけが、
> INSERT INTO tbl_data1 の対象となり、エラーは発生しないはず。
> ※ 実際に動かして試したわけじゃないので、エラーになったらごめん

ご回答ありがとうございます。
ぶなっぷさんが記述して頂いた方法で試してみたのですが

Column count doesnt match value count at row 1

というエラーが出てしまいました。






引用返信 編集キー/
■93317 / inTopicNo.8)  Re[3]: 別のテーブルの値を別のテーブルに挿入させてから表示したい
□投稿者/ 無名 (4回)-(2019/12/04(Wed) 17:17:06)
No93292 (KOZ さん) に返信
> ■No93289 (無名 さん) に返信
>>表が汚くなってしまいすみません。
> 図表モードに変えると良いですよ。
>
> UPDATE なのでは?
>
ご回答ありがとうございます。
UPDATEで試してみたのですが上手くいきませんでした。
引用返信 編集キー/
■93318 / inTopicNo.9)  Re[2]: 別のテーブルの値を別のテーブルに挿入させてから表示したい
□投稿者/ 無名 (5回)-(2019/12/04(Wed) 17:18:33)
No93291 (大谷刑部 さん) に返信
> ■No93288 (無名 さん) に返信
>>MySQLを使用しています。
> >
>>実行結果エラーメッセージ
>>フィールド'1_id'にデフォルト値がありません。
>
> キー項目だからでしょ。
>
> ↓以下を参照してください
> https://qiita.com/jlake/items/b92cf5281216825abe58

ご回答ありがとうございます。
すぐには理解ができないのでゆっくり読ませて頂きます。

引用返信 編集キー/
■93319 / inTopicNo.10)  Re[2]: 別のテーブルの値を別のテーブルに挿入させてから表示したい
□投稿者/ 無名 (6回)-(2019/12/04(Wed) 17:24:23)
No93293 (WebSurfer さん) に返信
> ■No93288 (無名 さん) に返信
>
>>そもそもこのやり方で合っているのか、合っているけど書き方が違うのか分かりません。
>
> 「やり方」を議論する以前に、何故 tbl_data1 テーブルの setubi_id フィールドが NULL だと、
> tbl_data2 テーブルの setubi_id 2 フィールドの 15 の行が該当するのか分からないのですか?

tbl_data1 テーブルのNullのところに新規追加でtbl_data2 テーブルの setubi_id 2データを挿入したいのです。

> 何らかのデフォルト値を決めておいて、NULL の場合はデフォルト値を当てはめるという話なら
> 分かるのですが。

渡されたsqlファイルの仕様がデフォルト値なしの設定になっていたので…。

追記質問になってしまうのですが
別のテーブルのPRIMARY KEYの取得はできないのでしょうか?
引用返信 編集キー/
■93320 / inTopicNo.11)  Re[3]: 別のテーブルの値を別のテーブルに挿入させてから表示したい
□投稿者/ KOZ (62回)-(2019/12/04(Wed) 18:09:33)
No93319 (無名 さん) に返信
> tbl_data1 テーブルのNullのところに新規追加でtbl_data2 テーブルの setubi_id 2データを挿入したいのです。

新規追加というとレコードの追加(INSERT) ということになってしまいます。

私が整形した図を前提にしますが、tbl_data1(更新前)の4レコード目の setubi_id を 15 に更新して tbl_data1(更新後)にしたいのですよね?
これはレコードの更新(UPDATE)です。

UPDATE を行うためには、tbl_data1 のレコードと、tbl_data2 のレコードを結び付ける条件が必要なのですが、その条件が不明確です。

> 追記質問になってしまうのですが
> 別のテーブルのPRIMARY KEYの取得はできないのでしょうか?

別にスレッドを立てたほうが良いです。

引用返信 編集キー/
■93325 / inTopicNo.12)  Re[3]: 別のテーブルの値を別のテーブルに挿入させてから表示したい
□投稿者/ WebSurfer (1984回)-(2019/12/05(Thu) 10:33:46)
No93319 (無名 さん) に返信

> tbl_data1 テーブルのNullのところに新規追加でtbl_data2 テーブルの setubi_id 2データを挿入したいのです。

意味が分かりません。tbl_data1 テーブルの既存のレコードの setubi_id 列が NULL の場合、
それを 15 に書き換えればいいのですか?

違うような気がしますが、もしそうだとすると、質問者さんの言う「新規追加」とか「挿入」
は言葉の使い方としてマシがっていて、実際はクエリで言う UPDATE ということのはずですけ
ど。

失礼ながら、質問者さん自身も何が分からないのか分からない状態で、何を聞けばいいのか
第三者に分かるよう文書化できるスキルがないような気がします。

質問者さんに課題を与えた人がいるようですが、であればまずその人に聞くべきです。face-to-face
で何度もやりとりをして、何を聞きたいのかを探ってもらって、回答してもらうというような
ことが期待できるのでは?

引用返信 編集キー/
■93332 / inTopicNo.13)  Re別のテーブルの値を別のテーブルに挿入させてから表示したい
□投稿者/ ぶなっぷ (215回)-(2019/12/05(Thu) 15:09:04)
2019/12/05(Thu) 15:10:10 編集(投稿者)
> Column count doesnt match value count at row 1
> 
> というエラーが出てしまいました。

ということは、tbl_data1 と tbl_data2 のカラムが一致してないですね。

であれば、tbl_data1のカラムと一致するように、
  SELECT * FROM tbl_data2 LEFT JOIN tbl_data1
の * の部分を書き換えましょう。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -