在MYSQL中防止重复

时间:2014-12-12 18:51:08

标签: php mysql

我正在运行一个脚本来在我的表中插入数据,但我也希望运行相同的脚本,但不会复制插入的数据:

这是我的代码,由于某些原因,当我运行它时,它仍无法正常工作,它仍会添加更多相同的数据。

$query = 'INSERT IGNORE INTO tbl_scrape_main ( 
   `scrape_main_id`, 
   `tbl_sc_date`,
   `tbl_sc_date_added`, 
   `tbl_sc_url`, 
   `tbl_sc_url_title`,
   `tbl_sc_new`, 
   `tbl_sc_title`, 
   `tbl_sc_town`, 
   `tbl_sc_state` 
) VALUES ( 
    '.sql_val($scrape_main_id).', 
   '.sql_val($temp['date']).',
   '.sql_val($date_added).', 
   '.sql_val($temp['url']).', 
   '.sql_val($temp['url_title']).',
   '.sql_val($temp['new_entry']).',
   '.sql_val($temp['title']).', 
   '.sql_val($temp['town']).', 
   '.sql_val($temp['state']).' 
)
ON DUPLICATE KEY UPDATE 
     `scrape_main_id` = '.sql_val($scrape_main_id).', 
     `tbl_sc_date_added` = '.sql_val($temp['date']).', 
     `tbl_sc_date` = '.sql_val($date_added).', 
     `tbl_sc_url` = '.sql_val($temp['url']).', 
     `tbl_sc_url_title` = '.sql_val($temp['url_title']).', 
     `tbl_sc_new` = '.sql_val($temp['new_entry']).', 
     `tbl_sc_title` = '.sql_val($temp['title']).', 
     `tbl_sc_town` = '.sql_val($temp['town']).', 
     `tbl_sc_state` = '.sql_val($temp['state']).'
'; 
$result = mysql_query($query) or die("<b>A fatal MySQL error occured</b>.<br />Query: ".$query."<br />Error: (".mysql_errno().") ".mysql_error());

可能是什么问题。

2 个答案:

答案 0 :(得分:1)

知道桌子上的键是完全回答问题的确是有帮助的,但是你的查询的一个问题是你正在使用INSERT IGNORE和ON DUPLICATE KEY UPDATE。您不应该同时使用这两个,因为第一个告诉MySQL如果遇到重复(这听起来像你想要的行为)则忽略新行,而第二个告诉它如果遇到重复则在原文中更新哪些字段。 / p>

根据您所描述的内容(“它仍会添加更多相同的数据”),听起来桌面上的唯一键并非您所期望的那样。

运行此命令以查看表上的键,并确保UNIQUE键符合您的预期(即:不应重复的键):SHOW CREATE TABLE tbl_scrape_main;

例如,如果您认为某行是重复的,如果'scrape_main_id'与另一行相同,则您需要该字段上的唯一键。如果相反,如果(scrape_main_id,tbl_sc_date_added)的组合相同,则认为一行是重复的,那些需要是您的唯一键...依此类推。查看this answer了解更多信息。

答案 1 :(得分:0)

感谢大家的帮助,事实证明我需要设置一个唯一的ID并且只使用INSERT IGNORE,效果很好。

再次感谢。