我有一个包含一个索引的数据库表,其中keyname是PRIMARY,Type是BTREE,Unique是YES,Packed是NO,Column是ID,Cardinality是728,排序规则是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");使用上面的删除重复项命令,会向表中添加一个额外的索引。下一行命令将删除这个添加的索引。
问题是,有时候,由删除重复项命令创建的已添加索引不会被随后的删除已添加索引命令删除,因此会向表中添加更多索引。这些额外的索引阻止脚本向数据库添加额外的数据,直到我手动删除添加的索引。
我的问题是:有没有可以添加到脚本中的命令或简短函数,可以删除除本文开头提到的原始索引之外的所有索引?
我确实读了下面的帖子,但我不知道这是不是正确的脚本:How to drop all of the indexes except primary keys with single query
发布于 2012-04-17 04:05:40
我不这么认为,你可以做的是创建副本,但这不会复制索引。例如,如果您设置create table1 as (select * from table_2),他将进行复制,但没有索引或PK。
发布于 2012-04-17 05:06:41
在所有的评论之后,我想我意识到发生了什么。实际上,您允许在数据库中存在重复项。你只是想清理它们几次。问题是,您选择的清理方法是通过创建唯一键并使用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)mysql编辑:由于@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插入新数据时,使用以下命令而不是"insert“使用"replace”,如果老行在主键或任何唯一索引上是重复的,则会将其删除
replace into posting_data (......) values(.....)https://stackoverflow.com/questions/10180653
复制相似问题