2016-05-11 8 views
1

重複したキー更新を扱う数十の記事を読んだことがありますが、いくつかの特定のものが存在する場合は更新し、それ以外の場合は挿入します

$query = "INSERT INTO $DatabaseName .`scores` (`id`, `name`, `score` , `score2`) 
    VALUES (NULL, '$name', '$score', '$score2');"; 
    ON DUPLICATE KEY UPDATE 
    name='$name', score='$score', score2='$score2', 

私は、ユーザーの「最高得点」を監視し、彼らの「現在のスコア」と比較する別のスクリプトを持っている:ここでは、現時点での私の簡単なコードです。 「現在のスコア」が「最高のスコア」よりも高くなると、上記のコードがトリガーされます。

デフォルトでは、ユーザーの詳細は(まだ存在しないため)データベースに挿入されます。しかし、その '名前'のエントリがすでに存在する場合は、 'score'と 'score2'のみを更新したいと思います( 'id'と 'name'は変更しないでください)。ここでは、「スコア」または「スコア2」が既存のエントリと同じであれば、それは問題ではないため、特にここでは「名前」の重複をチェックする必要があることに注意してください。

これはON DUPLICATE KEY UPDATEで可能ですか、特定のフィールドをフェッチして条件文を使用する必要がありますか?可能であれば私は好きではありません。

+1

"名前"に一意制約がありますか? –

+2

私が正しく理解していれば、 '名前'はあなたのDBスキーマのユニークなインデックスです。または、少なくとも、必要があります。この場合、既存の「名前」のINSERTがDUPLICATE KEYをトリガーし、スコア値を更新できるため、問題はありません。 – Holger

+0

私は実際には '名前'に一意の制約はありません。既に存在する 'name'の値を使って上記のコードを実行すると、何も挿入されないか、少なくとも既存の行は変更されません。 – FrontEnd

答えて

2

それはあなたがname列にUNIQUEインデックス追加した場合に動作する必要があります、

$query = "INSERT INTO $DatabaseName .`scores` (`name`,`score`,`score2`) 
      VALUES ('$name', '$score', '$score2') 
      ON DUPLICATE KEY UPDATE score='$score', score2='$score2'"; 

も:

ALTER TABLE `scores` ADD UNIQUE `name_unique` (`name`); 

そしてNULL IDを挿入する必要はありませんが、または名前の列を更新リクエストにPHP変数を直接入れるのではなく、準備されたステートメントを使用する必要があります。

+0

これは素晴らしいです。どうもありがとう :) – FrontEnd

関連する問題