[前][次][番号順一覧][スレッド一覧]

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に影響しないから問題ないのか
> > 問題あるのにわたしが気づいてない(動作しているようにみえている)のか
> > どうなんでしょうか。
> > 
> > 
> 


添付ファイル

[前][次][番号順一覧][スレッド一覧]