mysql:16702
From: ds1i-hsmt <ds1i-hsmt <ds1i-hsmt@xxxxxxxxxx>>
Date: Wed, 10 Aug 2022 13:40:37 +0900 (JST)
Subject: [mysql 16702] Re: [mysql 16701] [mysql 16700] INSERT SELECT でのテーブル別名の使い方
yoku0825さん 久光です 調べていただきありがとうございます。 安心できました。 > 2022/08/10 11:12、yoku0825 <yoku0825@xxxxxxxxxx>のメール: > > yoku0825といいます。 > > INSERT INTO .. SELECT .. の構文は以下のように定義されており、 > > 13078 INSERT_SYM /* #1 */ // INSERT > 13079 insert_lock_option /* #2 */ // 今回なし > 13080 opt_ignore /* #3 */ // 今回なし > 13081 opt_INTO /* #4 */ // INTO > 13082 table_ident /* #5 */ // tableA > 13083 opt_use_partition /* #6 */ // 今回なし > 13084 insert_from_constructor /* #7 */ // (id, ....) > 13085 opt_values_reference /* #8 */ // SELECT IFNULL ... > > https://github.com/mysql/mysql-server/blob/mysql-8.0.30/sql/sql_yacc.yy#L13077-L13133 > > > ご賢察の通りINSERT + tableA + (id, ..) と SELECT部分は別のものとして取り扱われるので、 > INSERTのlistの方で明示しなくても大丈夫なようです。 > > > yoku0825, > > 2022年8月10日(水) 10:52 ds1i-hsmt <ds1i-hsmt@xxxxxxxxxx>: > > > 久光と申します > > > > テーブル名tableAのカラム名id(UNSIGNED INT)の欠番を埋めながらレコードを追加するSQL文として > > 下記を考えました。 > > > > INSERT INTO `tableA` (`id`, ・・・) SELECT IFNULL((`id` + 1), 1) AS `minID`, ・・・ FROM `tableA` AS t1 WHERE NOT EXISTS (SELECT * FROM `tableA` AS t2 WHERE (t1.id + 1) = t2.id) LIMIT 1 > > > > 問題なく動作しているようなので一安心しているのですが > > INSERT INTO `tableA` AS t0 (t0.id, ・・・) > > のように最初のテーブルに別名をつけずに動作しているのが気になっています。 > > INSERT ....SELECT...だと SELECT内の記述がINSERTに影響しないから問題ないのか > > 問題あるのにわたしが気づいてない(動作しているようにみえている)のか > > どうなんでしょうか。 > > > > >