2012-02-06 12 views
-1

次のMySQLの構文が正しく動作:INSERT COUNT IF()= 0

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) 
    ) 
) 

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

+0

なぜあなた自身の自動インクリメントフィールドが必要ですか?既存のものに何が問題なの?また、スキームを使用して行を削除した場合、次に何かを挿入すると、重複が発生します。 – kba

+0

何のために良い方法がありますか?あなたは正確に何を達成しようとしていますか?列に番号を付けるだけの場合は、 'AUTO_INCREMENT'を再作成しないでください。ここでの最終目標は何ですか? – Naltharial

+0

Kristian、私が使用しているテーブルは、一時的なデータを格納するのに使われるので、もう少し柔軟性が必要です。 Naltharial、私はちょうど私のID番号に関するより柔軟性を得る方法を理解しようとしています。私はこのアプローチが正確ではないかもしれないことを認識しています。 今のところ、ここに投稿したのとまったく同じ、より良い代替構文を探しています。 – Mark

答えて

1

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

第二:それは仕事をsytnacticallyうとしても、それはfunctionalitywiseを動作しません:2つのこのようなクエリが

第3の並列行く場合は、巨大な競合状態を持っている:MySQLs AUTO_INCREMENTはありません正確に - あなたはそれに見てきました?

+0

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

関連する問題