MySQLで同一テーブルの主キー列を参照しながらINSERTする方法

目次

これは

MySQLのSQLで質問をもらったけどすぐに解決できなかったのでメモした記事です。

*XAMPP 8.2.4、MariaDB 10.4.28の環境で確認しました

なにが問題?

下記のコードで作ったテーブルがあります。

何レコードかデータが入っているとします。

create table table1(
  id int,
  value varchar(32)
);

このテーブルにidの最大値に1を加えた行を追加するために次のSQLを投げました。

insert into table1
values(
  (select max(id) + 1 from table1),
  "sub query!"
);

すると次のエラーが出ます。

ERROR 1093 (HY000): Table 'table1' is specified twice, both as a target for 'INSERT' and as a separate source for data

INSERTではデータとソースに同じテーブル使うなって言われていますが、副問い合わせ(サブクエリー)で動かないSQLでもありません。

*そもそもauto_increment付けてない設計している問題はここでは置いておいておく

解決したSQL

これを解決するには、次のように別名を付ける方法が1つ。

insert into table1
values(
  (select max(c1.id) + 1 from table1 as c1),
  "sub query!"
);

同じテーブル使っているのに、なぜ別名を付けただけのこれが通るのか(苦笑)

それか、そもそもテーブル指定を1回にする方法が1つ。

insert into table1 (id, value)
select max(id) + 1, "sub query!"
from table1;

INSERT … SELECT ステートメントを利用した方法ですね。

ただ、どちらもなんだか気持ち悪い(笑)

あとは

max(id)だけを指定するのではなく、次のようにifnull()しておきましょう。
テーブル作成直後だと、max(id)の結果はNULLなのでその対応ですね。

ifnull(max(id), 0) + 1

10年集客し続けられるサイトを、ワードプレスで自作する9つのポイント プレゼント

【最後まで読んでくれたあなたに】

あなたは、24時間365日、自分の代わりに集客し続けてくれるWebサイトを作りたい!と思ったことはありませんか?

私はこれまで500以上のWebサイトの構築と運営のご相談に乗ってきましたが、Webサイトを作ってもうまく集客できない人には、ある一つの特徴があります。

それは、「先を見越してサイトを構築していないこと」です。
Webサイトで集客するためには、構築ではなく「どう運用するか」が重要です。

しかし、重要なポイントを知らずにサイトを自分で構築したり、業者に頼んで作ってもらってしまうと、あとから全く集客に向いていないサイトになっていたということがよく起こります。

そこで今回、期間限定で
『10年集客し続けられるサイトをワードプレスで自作する9つのポイント』
について、過去に相談に乗ってきた具体的な失敗事例と成功事例を元にしてお伝えします。

・ワードプレスを使いこなせるコツを知りたい!
・自分にピッタリのサーバーを撰びたい!
・無料ブログとの違いを知りたい!
・あとで悔しくならない初期設定をしておきたい!
・プラグイン選びの方法を知っておきたい!
・SEO対策をワードプレスで行うポイントを知りたい!
・自分でデザインできる方法を知りたい!

という方は今すぐ無料でダウンロードしてください。

期間限定で、無料公開しています。

※登録後に表示される利用条件に沿ってご利用ください

コメントを残す