4

我有一个带有一个索引的数据库表,其中键名是 PRIMARY,类型是 BTREE,唯一是 YES,打包是 NO,列是 ID,基数是 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");

使用上面的 Remove Duplicates 命令,将一个附加索引添加到表中。下一行命令假设删除这个添加的索引。

问题是有时由 Removes Duplicates 命令创建的添加索引不会被以下 Delete added index 命令删除,因此会向表中添加更多索引。在我手动删除添加的索引之前,这些额外的索引会阻止脚本向数据库添加额外的数据。

我的问题:有没有可以添加到脚本中的命令或短函数来删除除本文开头提到的原始索引之外的所有索引?

我确实阅读了以下帖子,但我不知道这是否是要使用的正确脚本: 如何使用单个查询删除除主键之外的所有索引

4

2 回答 2

0

我不这么认为,您可以做的是创建副本,但这不会复制索引。例如,如果您将 create table1 作为 (select * from table_2),他将进行复制但没有索引或 PK。

于 2012-04-16T20:05:39.807 回答
0

在所有的评论之后,我想我意识到发生了什么。您实际上允许在数据库中重复。您只想清洁它们几次。问题是您选择清理它们的方法是通过创建唯一键并使用 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(.....)
于 2012-04-16T21:06:41.187 回答