我正在运行一个脚本来在表中插入数据,但我也想运行相同的脚本,但不重复插入的数据:
这是我的代码,由于某种原因,当我运行它时它不起作用,它仍然添加更多相同的数据。
$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());
可能是什么问题。
最佳答案
了解表上的键是什么确实有助于完全回答问题,但查询的一个问题是您同时使用 INSERT IGNORE 和 ON DUPLICATE KEY UPDATE。您不应该同时使用两者,因为第一个告诉 MySQL 如果遇到重复行则忽略新行(这听起来像是您想要的行为),而第二个告诉 MySQL 如果遇到重复则要更新原始行中的哪些字段。
根据您的描述(“它仍然添加更多相同的数据”),听起来您表上的唯一键不是您期望的那样。
运行此命令以查看表上的键,并确保 UNIQUE 键是您期望的键(即:不应重复的键):SHOW CREATE TABLE tbl_scrape_main;
例如,如果您认为某行“scrape_main_id”与另一行相同,则该行需要一个唯一键。如果相反,如果( scrape_main_id, tbl_sc_date_added )的组合相同,则您认为一行是重复的,那么这些需要是您的唯一键......依此类推。查看this answer了解更多。
关于php - 防止 MYSQL 中的重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27450184/