2011-10-01 14 views
5

私は(VALUESオプションを使用して)次のことを見てきました:SETオプションを使用してINSERTクエリでON DUPLICATE KEY UPDATEを使用できますか?

$query = "INSERT INTO $table (column-1, column-2, column-3) VALUES ('value-1', 'value-2', 'value-3') ON DUPLICATE KEY UPDATE SET column1 = value1, column2 = value2, column3 = value3, ID=LAST_INSERT_ID(ID)"; 

...しかし、私は私が使用しているものにDUPLICATE KEY UPDATE ON追加する方法を見つけ出すことはできません。

$query = "INSERT INTO $table SET 
    column-1 ='value-1', 
    column-2 ='value-2', 
    column-3 ='value-3' 
"; 

例えば:,擬似コード

$query = "INSERT INTO $table SET 
    column-1 ='value-1', 
    column-2 ='value-2', 
    column-3 ='value-3' 
    ON DUPLICATE KEY UPDATE SET 
    column1 = value1, 
    column2 = value2, 
    column3 = value3, 
    $id=LAST_INSERT_ID(id)"; 
    $my_id = mysql_insert_id(); 
"; 

私は読み後者より簡単に見つけるだろう。明確化を感謝し、マニュアルの例を見つけませんでした。

歓声

答えて

14

私はON DUPLICATE KEY UPDATE多くを使用しました。いくつかの状況では、それは本当に価値のある非標準のSQL拡張です。

まず、一意のキー制約が設定されていることを確認する必要があります。 ON DUPLICATE KEY UPDATE関数は、一意のキー違反があった場合にのみ起動します。ここで

は、一般的に使用される形式です:

$query = "INSERT INTO $table (column1, column2, column3) 
VALUES ('value-1', 'value-2', 'value-3') 
ON DUPLICATE KEY UPDATE 
column1 = values(column1), 
column2 = values(column2), 
column3 = values(column3);" 

column1 = values(column1)「クエリが重複キー違反をヒットしなかった場合、挿入されていたであろう値とカラム1を更新します。」を意味言い換えれば、インサートの作業内容をcolumn1に更新するだけです。

このコードを見ると、挿入しようとしている3つの列をすべて更新しているとは限りません。どの列に固有の制約がありますか?

EDIT:OPの質問ごとに「SET」形式のmysql挿入文に基づいて変更します。

基本的にON DUPLICATE KEY UPDATEを使用するには、通常と同じようにinsertステートメントを作成しますが、最後にはON DUPLICATE KEY UPDATE節を追加します。私はそれがこのように動作するはずと信じて:

INSERT INTO $table 
    set column1 = 'value-1', 
     column2 = 'value-2', 
     column3 = 'value-3' 
ON DUPLICATE KEY UPDATE 
    column1 = values(column1), 
    column2 = values(column2), 
    column3 = values(column3); 

ここでも、あなたが挿入しているいずれかの列が一意のインデックス(または列の組み合わせ)を持っている必要があります。これは、そのうちの1つが主キーであるか、またはテーブルにユニークなインデックスがあるためです。

+0

ありがとうKevin。私のID列はプライマリキーでユニークなインデックスを持っています。どのようにON DUPLICATE KEYが動作するのか理解していると思いますが、私の問題はVALUESではなくSETを使って別のINSERT構文に追加することです。私はそれが可能な場合、その構文の例を見たいと思います。 – shecky

+0

ちょっとわかりました。私は、重複したキー更新を使用してリフレッシュ時に追加された重複を防止したいと思いますが、ヘッダーを使用してユーザーを結果ページにリダイレクトしますが、ユーザーが戻って再提出することはできません。だから私はIDが存在する場合、私はすべてのフィールドを更新すると思った – shecky

+0

私はあなたが約質問しているフォーマットを使用するように変更しました、少なくとも私はやったと思う! –

1
+0

ありがとうKemal。 REPLACEは適切な方法のようにも思えますが、REPLACE&ON DUPLICATE KEY UPDATEの区別はまだ完全にわかりません。私はREPLACEを読んでいます。 – shecky

+0

P.私の理解では、REPLACEは索引付けに迷惑をかける可能性があるため、重複しているKEY UPDATE作業を実行しようとしています。 Thx again Kemal – shecky

+0

ここに置き換えることについての詳細を見るhttp://stackoverflow.com/questions/4205181/insert-to-table-or-update-if-exists-mysql – frazras

関連する問題