0

我试图防止将重复行插入 mysql 数据库。表名是收藏夹,我的表中有两列:company_id 和 user_id,我想防止用户尝试将同一公司作为“收藏夹”添加到数据库中两次。

这是我尝试过的:

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

但不起作用。

我还尝试“更改表”以添加主键,但是,我需要 user_id 和 item_id 作为键,因为相同的收藏项可以被多个“user_id”收藏,并且相同的“user_id”可以插入许多不同的收藏项目,以便可以“复制”数据,但我试图防止将完全相同的“user_id”和“item_id”插入两次。

我很感激这方面的任何帮助。

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

I do not recommend using "INSERT IGNORE" because it ignores ALL errors. My query will simply set item_id=item_id (no change) whenever it detects a duplicate key, so data will not be duplicated.

I also strongly encourage you to look into using MySQLi instead of the mysql_* functions. The PHP that you posted is very susceptible to mysql injections should you forget to check those two user input variables. Even the PHP manual actively discourages those functions for the same reason.

于 2012-06-24T13:59:26.353 回答
1

尝试将复合主键(fromitem_iduser_id)添加到表中。

如果您的表中已经有违反此约束的数据,您将收到错误消息,在这种情况下,您需要创建一个新表并将数据迁移到新表中。

于 2012-06-24T13:55:53.237 回答
1

You can use a composite primary key of the columns like so:

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

This means that same user_ids and item_ids are allowed and only a combination of them needs to be unique.

于 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 回答