INSERT IF COUNT()= 0

次のMySQL構文は正しく動作します。

SELECT 
  IF (
    (SELECT COUNT(id) FROM preorder) = 0,
    1,
    (SELECT MAX(id) + 1 FROM preorder)
  ) AS X

これは、私にテーブルプリオーダーに挿入したい値を与えます。試してみたら

INSERT INTO preorder (id) 
VALUES
  (SELECT 
    IF (
      (SELECT COUNT(id) FROM preorder) = 0,
      1,
      (SELECT MAX(id) + 1 FROM preorder)
    ) AS X)

それはもはや動作しません。 MySQLはちょうど私にmenual :-)を読むように言います

構文の目的は、独自の自動インクリメンタルフィールドを作成できることです。カウントがゼロの場合は1を挿入し、カウントがゼロでない場合はidカラムの最大値を挿入します。

編集: 私はそれが次の構文で動作するように管理しました:

INSERT INTO preorder (id) 
VALUES
  (
    IF (
      (SELECT COUNT(id) FROM preorder AS Y) = 0,
      1,
      (SELECT MAX(id) + 1 FROM preorder AS X)
    )
  )

より良い方法がありますか?

1
なぜあなた自身の自動インクリメントフィールドが必要ですか?既存のものに何が問題なの?また、スキームを使用して行を削除した場合、次に何かを挿入すると、重複が発生します。
追加された 著者 kba,
クリスチャンは、私が使用しているテーブルは、一時的なデータを格納するために使用されるので、もう少し柔軟性が必要です。 Naltharial、私はちょうど私のID番号に関するより柔軟性を得る方法を理解しようとしています。私はこのアプローチが正確ではないかもしれないことを認識しています。今のところ、私はちょうど私がここに投稿したのとまったく同じ、より良い代替構文を探しています。
追加された 著者 Mark,
何のために良い方法がありますか?あなたは正確に何を達成しようとしていますか?列に番号を付けるだけの場合は、 AUTO_INCREMENT を再作成しないでください。ここでの最終目標は何ですか?
追加された 著者 Naltharial,

1 答え

まず、サブクエリの SELECT に使用するテーブルに INSERT することはできません。

第2の:それはsytnactically動作する場合でも、それは機能的に動作しませんでした:あなたは巨大な競合状態、そのような2つのクエリが並行行く

3番目:MySQLの AUTO_INCREMENT はこれを正確に実行します。

1
追加された
ありがとう、オイゲン。構文は私のために働く。私は同時クエリが問題を引き起こすかもしれないことを認識しています。私はまだこれについて考えている。私はAUTO_INCREMENTについて知っています。どういうわけか、これは私が開発しているすべてのサーバ(おそらく古すぎるバージョンのMySQLや他のソフトウェア)で動作するとは限りません。私は他のいくつかのことを考え出した後、これを使うかもしれません。
追加された 著者 Mark,