2011-12-30 12 views
0

重複行を同じテーブルに入れようとしています。表Aにはがありません。auto_increment(残念ながら)INSERTごとにMySQLサブクエリの再評価

INSERT INTO A (id, foreign_id, value) 
    SELECT (SELECT MAX(id)+1 FROM A), 2, value 
     FROM A WHERE foreign_id = 1; 

しかし(SELECT MAX(id)+1 FROM A)が一度計算されるので、それは常に同じIDを返します。 2行目の挿入時に、クエリは失敗します(プライマリキーの重複)。

私はそれが最初に試さ:

INSERT INTO A (id, foreign_id, value) 
    SELECT MAX(id)+1, 2, value 
     FROM A WHERE foreign_id = 1; 

しかしMAX(id)+1アカウントWHERE foreign_id = 1にかかるので、私は未使用のIDを取得します保証はありません。私はどちらかに進むことができますどのように

  • は、一般的に、各INSERT
  • 以上再計算されたサブクエリを持っている:なしAUTO_INCREMENT
+0

マルチユーザシステムでは、一意の番号を生成するために 'max(id)+ 1'を使用すると失敗します。 –

+0

の代わりにautoincrementカラムを使用する必要があります。実際には複製していないこと、異なるIDを持つ別のレコードを作成しようとしていること、foreign_IDが2ですが、foreign_IDが1のレコードと同じ値を持つこと?あなたは{1,1,1} {3,1,2}のレコードを持っていれば{4,2,1}と{5,2,2}の新しいセットが必要ですか?もしそうなら、あなたは「複製する」と考えているレコードはいくつありますか?既存のレコードを順番に従わなければなりませんか? {4,2,1}と{5,2,2}は{4,2,1}と{6,2,2}の代わりになりますか?作業? – xQbert

+0

@a_horse_with_no_nameはい、私は知っている、これは単なる大きなスクリプト、マルチユーザーや何もありません。 –

答えて

2

はありません与えられた私のテーブルの行を複製あなたは変数を使ってみましたか?

SET @max=SELECT MAX(id); 
INSERT INTO A (id, foreign_id, value) 
    SELECT @max:[email protected]+1, 2, value 
     FROM A WHERE foreign_id = 1; 
+0

おかげでトリックは、初めて私は変数を使用しました。答えを受け入れる前に他に解決策があるのであればもう少し時間を割いておきます。 –

+0

あなたはどちらでも構いません – gotofritz

1

私はこれがうまくいくと思います。 トリックは、あなたが(変数を使用しない限り)+1を使用することはできませんが、既存のIDを使用して毎回一意のIDを与えるmaxに追加することができます。

INSERT INTO A (id, foreign_id, value) 
    SELECT (SELECT MAX(id) FROM A)+ID, 2, value 
     FROM A WHERE foreign_id = 1; 
+0

IMO:fritzfromLondonの答えは、間隔を置かずにシーケンスを保持したい場合に適しています。私の場合は、既存のレコードと同様の間隔を保ちます(ギャップがあり何らかの理由でそれらを維持したい場合) – xQbert

+0

興味深いことに、列の型によって許容される最大数に注意しても面白いです。 –

関連する問題