お世話になっております。
MYSQLのprimary keyの機能を用いて、重複するレコードをinsertしない方法を検討しております。
下記のような単純なケースで試してみたのですが、1回目で$aの2つのデータをinsertし、2回目でこれにarray(3,"scissors")を加えた3つ目のデータをまたinsertします。
ここでポイントは2回目の配列は実際に、既に格納したarray(1,"pen"),array(2,"paper")を
抜いて、array(3,"scissors")だけを選択することは実際に難しい状況であり、一意であるidの1,2,3をprimary keyにして、既に格納されているarray(1,"pen"),array(2,"paper")はdupulicate itemとして弾くことを思いつきました。
しかし実際には
string 'SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '3' for key 'id'' (length=86)
と怒られ、期待していた1、2を弾き、3だけ格納するという処理は行ってくれず、errorですべてのデータを格納してくれないという結果になりました。
①ここでprimary keyを利用して重複データはinsertから除外するような処理は不可能なのでしょうか?
②もしこの方法が不可能な場合には、実際に重複データを弾くために、皆様はどのようにmysql上処理を行っていらっさいますでしょうか?(またはphp側の処理でなんとか重複をそぎ落とすのか、、、)
まだまだ知識が乏しいのですが、よろしくお願い申し上げます。
//1回目 $a=array(array(1,"pen"),array(2,"paper")); try { $pdo = new PDO($dsn, $user, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $pdo->prepare("INSERT INTO banana (id,name)VALUES(:id,:name)"); for ($i=0; $i <3 ; $i++) { $stmt->bindValue(':id',$a[$i][0],PDO::PARAM_STR); $stmt->bindValue(':name',$a[$i][1],PDO::PARAM_STR); $stmt -> execute(); } ?>
//2回目 $a=array(array(1,"pen"),array(2,"paper"),array(3,"scissors")); try { $pdo = new PDO($dsn, $user, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $pdo->prepare("INSERT INTO banana (id,name)VALUES(:id,:name)"); for ($i=0; $i <3 ; $i++) { $stmt->bindValue(':id',$a[$i][0],PDO::PARAM_STR); $stmt->bindValue(':name',$a[$i][1],PDO::PARAM_STR); $stmt -> execute(); }
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/10/03 23:30