質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

1126閲覧

DBに一度にInsertする際に、IFNULLを複数回使いたい

sekitaninaru

総合スコア13

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2019/04/14 15:34

前提・実現したいこと

入力フォームで入力された回答をDBに一度にInsertしたいです。
その際のMySQLのIFNULLを使ってQUESTION_IDをセットしたいのですが、下記のエラーが出てしまいます。
一度にInsertする際はIFNULLを複数回使うことはできないのでしょうか?
また、ほかの実現方法はありますか?

発生している問題・エラーメッセージ

#HY000You can't specify target table 'question_answer' for update in FROM clause

該当のソースコード

insert into question_answer (USER_ID,QUESTION_ID,QUESTION_NO,ANSWER,INSERT_USER,UPDATE_DATE,UPDATE_USER,DELETE_FLAG) values ( '0001', IFNULL((select max(QUESTION_ID) from (select * from question_answer) as Q1),'0') + 1, '1', '回答1', '0001', CURRENT_TIMESTAMP, '0001', '0' ), ( '0001', IFNULL((select max(QUESTION_ID) from (select * from question_answer) as Q2),'0') + 1, '2', '回答2', '0001', CURRENT_TIMESTAMP, '0001', '0' ), ( '0001', IFNULL((select max(QUESTION_ID) from (select * from question_answer) as Q3),'0') + 1, '3', '回答3', '0001', CURRENT_TIMESTAMP, '0001', '0' )

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

なんか無駄

SQL

1create table question_answer (USER_ID int not null,QUESTION_ID int not null unique key);

に対して、こうすればいいですが

SQL

1insert into question_answer (USER_ID,QUESTION_ID) values 2(1,coalesce((select max_uid from (select max(QUESTION_ID) as max_uid from question_answer) as sub),0)+1), 3(1,coalesce((select max_uid from (select max(QUESTION_ID) as max_uid from question_answer) as sub),0)+1), 4(2,coalesce((select max_uid from (select max(QUESTION_ID) as max_uid from question_answer) as sub),0)+1), 5(1,coalesce((select max_uid from (select max(QUESTION_ID) as max_uid from question_answer) as sub),0)+1);

2個目以降のデータは必ず max(QUESTION_ID)が1以上になるんですよね?
であれば

SQL

1/* truncate question_answer;*/ 2insert into question_answer (USER_ID,QUESTION_ID) values 3(1,coalesce((select max_uid from (select max(QUESTION_ID) as max_uid from question_answer) as sub),0)+1), 4(1,(select max_uid from (select max(QUESTION_ID) as max_uid from question_answer) as sub)+1), 5(2,(select max_uid from (select max(QUESTION_ID) as max_uid from question_answer) as sub)+1), 6(1,(select max_uid from (select max(QUESTION_ID) as max_uid from question_answer) as sub)+1);

しかも max(QUESTION_ID)がnullになるのは一番最初のデータを投入するときだけなのですから
最初だけダミーデータを投入しておけば済む話

SQL

1/* truncate question_answer;*/ 2insert into question_answer (USER_ID,QUESTION_ID) values (9999,0); 3insert into question_answer (USER_ID,QUESTION_ID) values 4(1,(select max_uid from (select max(QUESTION_ID) as max_uid from question_answer) as sub)+1), 5(1,(select max_uid from (select max(QUESTION_ID) as max_uid from question_answer) as sub)+1), 6(2,(select max_uid from (select max(QUESTION_ID) as max_uid from question_answer) as sub)+1), 7(1,(select max_uid from (select max(QUESTION_ID) as max_uid from question_answer) as sub)+1);

投稿2019/04/15 01:18

yambejp

総合スコア114585

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sekitaninaru

2019/04/15 14:19

ダミーデータを投入する手段があったのですね。 おかげさまで解決しました。ありがとうございます。
guest

0

sql

1insert into question_answer (USER_ID,QUESTION_ID,QUESTION_NO,ANSWER,INSERT_USER,UPDATE_DATE,UPDATE_USER,DELETE_FLAG) 2values 3( 4 '0001', 5 select ifnull(max(QUESTION_ID), 0) + 1 from question_answer) as Q1), 0, 6 '1', 7 '回答1', 8 '0001', 9 CURRENT_TIMESTAMP, 10 '0001', 11 '0' 12), 13...

投稿2019/04/14 15:40

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問