我正在运行一个脚本来在我的表中插入数据,但我也希望运行相同的脚本,但不会复制插入的数据:
这是我的代码,由于某些原因,当我运行它时,它仍无法正常工作,它仍会添加更多相同的数据。
$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());
可能是什么问题。
答案 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,效果很好。
再次感谢。