MySQLで、オートインクリメントを設定した主キーの値を、別のカラムでINSERT時に使用したい、という要件があったのですが、見事にハマりました(汗)
MySQLではINSERTするときに副問合せ(サブクエリ)に同一のテーブルを指定できないという制約があります。(さっき調べたところマニュアルに記述がありました。)
なので、オートインクリメントの値を使用したい場合、別のSQL文にするとかちょっとカッコ悪いことになってしまいます。
また、直接値を取りにいっても値は0になります。(オートインクリメントされる前なので当たり前といえば当たり前なんですけどね…。)
[SQL]
INSERT INTO table_name VALUES ('', 'hoge', auto_increment_column);
ついでに、MAX関数で取得しようとすると、
[SQL]
INSERT INTO table_name VALUES ('', 'hoge', max(auto_increment_column) + 1));
[結果]
「無効なグループ関数の使用」と言われてしまいます。
で、解決方法ですが、灯台下暗し。
『INSERT ~ SELECT』構文なるものがありました…valuesばっか使ってたので存在すら知らなかった。。。
『INSERT ~ SELECT』構文のマニュアル
dev.mysql.com/doc/refman/4.1/ja/insert-select.html
で、解法ですが、下記の通り。
[SQL]
INSERT INTO table_name ( text ) SELECT max(auto_increment_column) + 1 FROM table_name;
彷徨った果に見つけた下記のブログに感謝します。
このブログも誰かの助けになればよいのですが。
[参考文献]
oldblog.xenophy.com/index.php
MySQLではINSERTするときに副問合せ(サブクエリ)に同一のテーブルを指定できないという制約があります。(さっき調べたところマニュアルに記述がありました。)
なので、オートインクリメントの値を使用したい場合、別のSQL文にするとかちょっとカッコ悪いことになってしまいます。
また、直接値を取りにいっても値は0になります。(オートインクリメントされる前なので当たり前といえば当たり前なんですけどね…。)
[SQL]
INSERT INTO table_name VALUES ('', 'hoge', auto_increment_column);
ついでに、MAX関数で取得しようとすると、
[SQL]
INSERT INTO table_name VALUES ('', 'hoge', max(auto_increment_column) + 1));
[結果]
#1111 - Invalid use of group function
「無効なグループ関数の使用」と言われてしまいます。
で、解決方法ですが、灯台下暗し。
『INSERT ~ SELECT』構文なるものがありました…valuesばっか使ってたので存在すら知らなかった。。。
『INSERT ~ SELECT』構文のマニュアル
dev.mysql.com/doc/refman/4.1/ja/insert-select.html
で、解法ですが、下記の通り。
[SQL]
INSERT INTO table_name ( text ) SELECT max(auto_increment_column) + 1 FROM table_name;
彷徨った果に見つけた下記のブログに感謝します。
このブログも誰かの助けになればよいのですが。
[参考文献]
oldblog.xenophy.com/index.php
PR
トラックバック
トラックバックURL: