Php 防止mysql数据库中出现重复行,忽略不工作
我试图防止在mysql数据库中插入重复的行。表名是favorites,我的表中有两列:company_id和user_id,我想防止用户两次尝试将同一家公司作为“favorite”添加到db中 这就是我所尝试的:Php 防止mysql数据库中出现重复行,忽略不工作,php,mysql,Php,Mysql,我试图防止在mysql数据库中插入重复的行。表名是favorites,我的表中有两列:company_id和user_id,我想防止用户两次尝试将同一家公司作为“favorite”添加到db中 这就是我所尝试的: $query = "INSERT IGNORE INTO favorites (item_id, user_id) VALUES ( $item_id, $user_id )"; mysql_query($query,$conn); 但是不起作用 我还尝试“更改表”以添加主
$query = "INSERT IGNORE INTO favorites (item_id, user_id) VALUES ( $item_id, $user_id )";
mysql_query($query,$conn);
但是不起作用
我还尝试“更改表”以添加主键,但是,我需要将user\u id和item\u id都作为键,因为同一个偏好项可以由多个“user\u id”偏好,并且同一个“user\u id”可以插入许多不同的偏好项,因此,数据可以“复制”,但我试图防止完全相同的“用户id”和“项目id”被插入两次
非常感谢您的帮助。尝试将复合主键(从
项目id
和用户id
)添加到表中
如果表中已有违反此约束的数据,则会出现错误。在这种情况下,您需要创建一个新表并将数据迁移到新表中。尝试向表中添加一个复合主键(从
项目id
和用户id
)
如果表中已有违反此约束的数据,则会出现错误。在这种情况下,您需要创建一个新表,并将数据迁移到新表中。
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);
}
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);
}
据我所知,最简单的方法是在user\u id-item\u id对上添加唯一约束,这将通过以下查询完成:
ALTER TABLE favorites
ADD UNIQUE(item_id,user_id)
然后,每当您尝试插入表中已存在的user\u id-item\u id对时,insert查询将返回错误,因此应修改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_*函数。如果您忘记检查这两个用户输入变量,那么您发布的PHP非常容易受到mysql注入的影响。基于同样的原因,甚至PHP手册也不鼓励使用这些函数。据我所知,最简单的方法是在user\u id-item\u id对上添加唯一的约束,这将通过以下查询完成:
ALTER TABLE favorites
ADD UNIQUE(item_id,user_id)
然后,每当您尝试插入表中已存在的user\u id-item\u id对时,insert查询将返回错误,因此应修改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_*函数。如果您忘记检查这两个用户输入变量,那么您发布的PHP非常容易受到mysql注入的影响。出于同样的原因,甚至PHP手册也不鼓励使用这些函数。您可以使用以下列的复合主键:
ALTER TABLE table ADD PRIMARY KEY ( 'item_id' , 'user_id' )
这意味着允许使用相同的用户ID和项目ID,并且只有它们的组合才需要唯一。您可以使用以下列的复合主键:
ALTER TABLE table ADD PRIMARY KEY ( 'item_id' , 'user_id' )
这意味着允许使用相同的用户ID和项目ID,并且只需要它们的组合是唯一的。您是否尝试了两列的复合主键?否,您可以删除或显示一个示例吗?:)
altertable TABLE ADD主键('item\u id','user\u id')
这是因为现在表不能包含item\u id-user\u id的重复组合。用户id 1在那里两次偏爱某些item id 42。这是因为您的表已经有重复的条目。您是否可以创建一个设置了主键的新主键,然后在此处“复制忽略”旧表中的所有值?您是否尝试了两列的复合主键?否,您可以删除或显示一个示例吗?:)altertable TABLE ADD主键('item\u id','user\u id')
这是因为现在表不能包含item\u id-user\u id的重复组合。用户id 1在那里两次偏爱某些item id 42。这是因为您的表已经有重复的条目。您可以创建一个设置了主键的新表,然后在这里“复制忽略”旧表中的所有值吗?谢谢您的帮助。对于那些有类似问题的人:请参阅上面的@Esailijas评论以了解更多详细信息。感谢您的帮助。对于那些有类似问题的人:请参阅上面的@Esailijas评论以了解更多详细信息。