【问题标题】:Is there a MySQL command drop all indexes except PRIMARY index?是否有 MySQL 命令删除除 PRIMARY 索引之外的所有索引?
【发布时间】:2012-04-28 04:02:18
【问题描述】:

我有一个带有一个索引的数据库表,其中键名是 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 命令删除,因此会向表中添加更多索引。在我手动删除添加的索引之前,这些额外的索引会阻止脚本向数据库添加额外的数据。

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

我确实阅读了以下帖子,但我不知道这是否是要使用的正确脚本: How to drop all of the indexes except primary keys with single query

【问题讨论】:

  • 我不认为它是用于 MySQL 的。它声明它适用于 SQL Server
  • 对不起@sammy,我错过了这一点。
  • 为什么要不断地添加和删除唯一索引?首先,您不应该让那些重复项出现在那里。只需保留唯一键并在插入新行时处理错误。这样会更有效率。
  • 如帖子中所述从 MySQL 数据库表中删除重复项命令:mysql_query("Alter IGNORE table $TableName add unique key (Entry_Date)");自动添加附加索引。
  • @Sammy: 再说一遍:不要通过不删除唯一索引,让那些重复项一开始就进入表中。

标签: mysql indexing sql-delete


【解决方案1】:

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

【讨论】:

  • 在每次网页加载时不断创建新表效率不高。必须有更好的方法。
【解决方案2】:

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

【讨论】:

  • A.J.我是 MySQL 新手。你是说用这个替换原始帖子中提到的两行 mysql_query 代码吗? mysql_query("DELETE FROM $TableName WHERE PRIMARY not in (SELECT min(PRIMARY) FROM $TableName group by Entry_Date)");如果是这样,这是否是在我的 PHP 脚本中使用的正确语法?这会删除重复的条目吗?
  • 是的。但 PRIMARY 必须是作为表主键的列的名称。顺便说一句,这仅在一张或多张桌子上运行吗?如果在一张桌子上,那么主键列的名称是什么?
  • 在phpmyadmin的Table structure Indexes部分,主键列称为id(Column为id)。此操作仅针对一张表。我修改了代码以读取 mysql_query("DELETE FROM $TableName WHERE id not in (SELECT min(id) FROM $TableName group by Entry_Date)");现在这正确吗?顺便说一句...感谢您的所有帮助。
  • 所以将 PRIMARY 替换为您在评论中输入的 ID。
  • 你真的需要允许重复行吗?为什么首先有重复的行?为什么不按照@a_horse_with_no_name 的建议去做,只允许插入一行并忽略重复项?插入所有行只是为了稍后删除它们不是更好吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-02
  • 2010-10-27
相关资源
最近更新 更多