2016-12-12 21 views
-1

私はMySQLテーブルを持っており、私はクエリをINSERT ON DUPLICATE UPDATEする必要があります。 "id"は主キーですが、今は必要ありません。重複更新に挿入

"id2"、 "name"、 "city"という値をテーブルに挿入する必要があります。 "id2"と "name"に同じ値の行がある場合は、単に "city"を更新してください。 どこが間違っていますか?あなたは重複を検出できるようにするにはMySQLのための2つの列id2, name間で一意性を強制するためのインデックスを作成する必要がありますON DUPLICATE KEY UPDATE使用するためには

$query = "INSERT INTO 
      `table` 
       (id2, name, city) 
      VALUES 
       ('$new_id2', '$new_name', '$new_city') 
      ON DUPLICATE KEY UPDATE 
       city='$new_city' 
      WHERE 
       `id2`='$new_id2' AND `name`='$new_name' 
      "; 
+0

どのようなエラーメッセージが表示されますか? – Rahul

+1

構文が正しくありません。 'INSERT'文にはWHERE句がありません。 「重複キー更新」の後に終了します。 –

+0

ありがとうございます。そして、これを解決する方法は? – Patrik

答えて

3

。これは、あなたがこれを試みる前に、あなたはすでにどこでもあなたのテーブルにid2, nameの組み合わせの複数の出現を持っていないことを確認する必要がありidx_uniq_id2_name `

と呼ばれる識別子でインデックスを作成します。それが行を返さない場合は

-- Check for non-unique rows 
SELECT id2, name FROM table GROUP BY id2, name HAVING COUNT(*) > 1 

、あなたは成功したマルチカラムインデックスを作成することができます:あなたがしていることを確認することができます。

-- Create a multi-column unique index 
ALTER TABLE `table` ADD UNIQUE INDEX `idx_uniq_id2_name` (`id2`, `name`); 

インデックスが作成された後、あなたは(INSERTに許可されることはありません)それはWHERE句を持っていないようにあなたのINSERTステートメントの構文を修正する必要があります。

INSERT INTO `table` 
    (id2, name, city) 
    VALUES ('$id2', '$name', '$new_city') 
    ON DUPLICATE KEY UPDATE city = '$new_city'; 

SQL文で$new_cityような変数の使用は、あなたのコード内でPDOまたはMySQLiをしてprepare()/execute()を使用していないお勧め予めご了承ください。状況を改善する方法の提案については、How can I prevent SQL injection in PHPのレビューをお勧めします。

+0

これは動作します。 – Patrik

関連する問題