2012-05-02 16 views
1

クエリに「重複キー更新に挿入」を使用して、新しい行が存在しない場合は挿入するか、存在する場合は行を更新したいと考えています。私は何を見つけ出すように見えることはできません、私は一意のIDを持っていない場合は、これを使用する方法である(行がまだ作成されていないため、このIDは、挿入時にオートインクリメントされます)で、重複キーの挿入

insert into foodchoices (unique,notunique) values (Idonthavethis,'test') 
on duplicate key update notunique = 'stuff'; 

今この例では、 "Idonthavethis"と書かれていますが、まだこの行が挿入されていないため、このフィールドに固有の値はありません。しかし、私は何とかこの挿入を期待して、私はちょうど方法を知らない。

insert into foodchoices (notunique) values ('test') 

しかし、既に存在するフィールドの場合、私はそのユニークな値を持っています。ワイルドカードや、ユニークな価値を持たないときに使用できるものがありますか?

+0

レコードがすでに存在するかどうかをどのように判断しますか? 'notunique'が本当にユニークでない場合、新しい行を挿入し、複数のバージョンのどれかを' test 'という値で選ぶこととの違いは何ですか? – eggyal

答えて

3

私はこの答えはMySQL docsで対処されると信じて:

表はAUTO_INCREMENT列とINSERTが含まれている場合... UPDATEは、行を挿入し、LAST_INSERT_ID()関数はAUTO_INCREMENT値を返します。ステートメントが行を代わりに更新する場合、LAST_INSERT_ID()は意味がありません。ただし、これを回避するにはLAST_INSERT_ID(expr)を使用します。 idがAUTO_INCREMENT列であるとします。更新のためにLAST_INSERT_ID()を意味のあるものにするには、次のように行を挿入します。

INSERT INTO table (a,b,c) VALUES (1,2,3) 
    ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3; 
0

あなたがしようとしている可能性があるのは、あなたが持っている値を持つ行を選択することです(それが存在する場合は更新されます)。そうでない場合は挿入します。それはもう一つの文章です。

ちょうど持っていない既存の値(生成されたID)をどのように比較できるか分かりません。さらに、IDがDBにシードされている場合、どのように複製されるのでしょうか?

0

"notunique"カラムに制約を追加するためにテーブル構造を変更する必要があるかもしれません。したがって、あなたはできます:

insert into foodchoices (notunique) values ('test') on duplicate key update columntostoreyouruniqueid = unique; 

もしnotuniqueにconstaintがないなら、それはあなたがuniqueidをセットとして持つことを意味します。だからそれは二重のクエリをしなければならない。

関連する問題