0

重複する行が mysql データベースに挿入されないようにしようとしています。テーブル名はお気に入りで、テーブルには company_id と user_id の 2 つの列があります。ユーザーが同じ会社を「お気に入り」としてデータベースに 2 回追加しようとするのを防ぎたいです。

これは私が試したものです:

$query  = "INSERT IGNORE INTO favorites (item_id, user_id) VALUES ( $item_id, $user_id )";
    mysql_query($query,$conn);

しかし、うまくいきません。

また、主キーを追加するために「テーブルを変更」しようとしましたが、user_id と item_id の両方をキーにする必要があります。お気に入りのアイテムが異なるため、データを「複製」できますが、まったく同じ「user_id」と「item_id」が2回挿入されるのを防ごうとしています。

これについて何か助けていただければ幸いです。

4

4 に答える 4

2

私が知っている最も簡単な方法は、user_id-item_id ペアに UNIQUE 制約を追加することです。これは、次のクエリで実現できます。

ALTER TABLE favorites 
ADD UNIQUE(item_id,user_id)

挿入クエリは、テーブルに既に存在する user_id-item_id ペアを挿入しようとするたびにエラーを返すため、INSERT クエリを次のように変更する必要があります。

INSERT INTO favorites(item_id,user_id) 
     VALUES ($item_id,$user_id) 
ON DUPLICATE KEY UPDATE item_id=item_id

すべてのエラーを無視するため、「INSERT IGNORE」の使用はお勧めしません。私のクエリは、重複キーを検出するたびに item_id=item_id (変更なし) を設定するだけなので、データは重複しません。

また、mysql_* 関数の代わりにMySQLiの使用を検討することを強くお勧めします。あなたが投稿した PHP は、これら 2 つのユーザー入力変数をチェックするのを忘れると、mysql インジェクションの影響を非常に受けやすくなります。PHP マニュアルでさえ、同じ理由でこれらの関数を積極的に思いとどまらせています。

于 2012-06-24T13:59:26.353 に答える
1

複合主キー (item_idおよびからuser_id) をテーブルに追加してみてください。

この制約に違反するデータがテーブルに既にある場合、エラーが発生します。この場合、新しいテーブルを作成し、データを新しいテーブルに移行する必要があります。

于 2012-06-24T13:55:53.237 に答える
1

次のように、列の複合主キーを使用できます。

ALTER TABLE table ADD PRIMARY KEY ( 'item_id' , 'user_id' )

これは、同じ user_ids と item_ids が許可され、それらの組み合わせのみが一意である必要があることを意味します。

于 2012-06-24T14:04:48.303 に答える
0

INSERT IGNOREキーでのみ機能します。通常、持っている唯一のキーは、テーブルの主キーです。

したがって、最初に一致する行を検索し、それらが存在する場合は、新しいレコードを挿入しないでください。

$search_q = "SELECT `id` FROM `favorites` WHERE `item_id` = ";
$search_q .= mysql_real_escape_string($item_id);
$search_q .= " AND `user_id` = ";
$search_q .= mysql_real_escape_string($user_id);


$r = mysql_query($search_q);
if (!mysql_num_rows($r)) {
   # This combination doesn't exist
   $insert_q = "INSERT INTO `favorites` (`item_id`,`user_id`) VALUES (";
   $insert_q .= mysql_real_escape_string($item_id).",";
   $insert_q .= mysql_real_escape_string($user_id).")"
   mysql_query($insert_q);  
}
于 2012-06-24T13:58:27.657 に答える