2013-03-08 15 views
5

学習MySQLとの質問の持つ山...Mysql:行が存在しない場合は挿入し、そうでない場合は更新します。より簡単なコマンドはありますか?

私は簡単なことで所望の効果を達成することができます

$mysqli->query("INSERT results SET user_id = '".$user_data[0]['user_id']."', logo_id = '".$mysqli->real_escape_string($_GET['logo_id'])."'"); 
$mysqli->query("UPDATE results SET result_tries = result_tries +1 WHERE logo_id = '".$mysqli->real_escape_string($_GET['logo_id'])."' AND user_id = '".$user_data[0]['user_id']."'"); 

logo_idとUSER_IDは一意である必要がありますように、私は、テーブルの上にDB unique checkてきました。行が存在すれば最初のクエリは失敗し、2番目の更新は実行されます...しかし、これはハックのような感じです...これを行うには良い方法はありますか?

+0

スタックオーバーフローについては、(http://stackoverflow.com/questions/6030071/mysql-table-insert-if-not-exist-otherwise-update)を参照してください。 – shola

+0

可能な複製http://stackoverflow.com/questions/5557479/mysql-update-if-exists-else-insert –

答えて

8

私は任意の一意のインデックス列を持っているし、私の目標を達成するためには、where句を使用する必要がないので、これは、私が来ている最もエレガントなソリューションです

$user_id = $user_data[0]['user_id']; 
$logo_id = $mysqli->real_escape_string($_GET['logo_id']); 

$sql = "INSERT INTO results (user_id, logo_id, result_tries) 
     VALUES ('$user_id', '$logo_id', 0) 
      ON DUPLICATE KEY UPDATE result_tries = result_tries + 1"; 

$mysqli->query($sql); 
0

をお試しください:

DELETE FROM assignment_status WHERE assignment_id = 114 AND user_id = 1; 
INSERT INTO assignment_status (assignment_id, user_id, status, note) VALUES (114, 1, 2, "Some useful information goes here..."); 

ありがとうございましたStack Overflow thread(そこにも説明があります)

関連する問題