我有一个数据库表,其中一个索引的键名是PRIMARY,Type是BTREE,Unique是YES,Packed是NO,Column是ID,Cardinality是728,Collation是A.
我有一个在页面加载时运行的脚本,它将条目添加到MySQL数据库表中,并从数据库表中删除重复项。
以下是删除重复项的脚本部分:
// Removes Duplicates from the MySQL Database Table
// Removes Duplicates from the MySQL Database Table based on 'Entry_Date' field
mysql_query("Alter IGNORE table $TableName add unique key (Entry_Date)");
// Deletes the added index created by the Removes Duplicates function
mysql_query("ALTER TABLE $TableName DROP INDEX Entry_Date");
使用上面的Remove Duplicates命令,会向表中添加一个附加索引。下一行命令是删除此添加的索引。
问题在于,有时删除重复项命令创建的添加索引不会被以下删除添加的索引命令删除,因此会向表中添加更多索引。这些附加索引会阻止脚本向数据库添加其他数据,直到我手动删除添加的索引。
我的问题: 是否有一个命令或简短的函数可以添加到脚本中,删除除了本文开头提到的原始索引之外的所有索引?
我确实阅读了以下帖子,但我不知道这是否是正确使用的脚本: How to drop all of the indexes except primary keys with single query
答案 0 :(得分:0)
我不这么认为,你可以做的是创建副本但不会复制索引。例如,如果你做 将table1创建为(select * from table_2),他将复制但没有索引或PK。
答案 1 :(得分:0)
在所有评论之后,我想我意识到发生了什么。 您实际上允许在数据库中重复。你只想清理一下它们。 问题是您选择清除它们的方法是创建一个Unique键并使用IGNORE选项,这会导致重复行被删除而不是创建唯一键失败。然后删除唯一键,以便可以再次添加重复的行。你的问题是有时不会删除唯一键。
我建议您以其他方式删除重复项。假设您的表名是“my_table”,主键是my_mey_column:
delete from my_table where my_key_column not in (select min(my_key_column) from my_table group by Entry_Date)
编辑:由于@a_horse_with_no_name
指向的mysql限制,上述操作无法正常工作尝试以下三个查询:
create temporary table if not exists tmp_posting_data select id from posting_data where 1=2
insert into tmp_posting_data(id) select min(id) from posting_data group by Entry_Date
delete from Posting_Data where id not in (select id FROM tmp_posting_data)
作为最后一点,请尝试重新考虑是否需要按照@a_horse_with_no_name的建议复制行。而不是允许输入然后删除行,您可以在数据库中创建一次唯一键,如:
Alter table posting_data add unique key (Entry_Date)
然后,当您从RSS插入新数据时,使用以下代替“插入”使用“替换”,如果它在主键或任何唯一索引上是重复的,则将删除旧行
replace into posting_data (......) values(.....)