2012-07-15 127 views
13

是否有删除MySQL中重复键记录的方法?MySQL插入重复键;删除?

假设我们在数据库中有一个具有特定主键的记录,并且我们尝试使用相同的密钥添加另一个记录 - ON DUPLICATE KEY UPDATE只会更新记录,但如果已存在,是否有删除记录的选项?这是用于点击按钮的简单的输入/输出功能。

+3

使用**触发器** – rekenerd 2012-07-15 20:03:24

+0

谢谢 - 我认为这是唯一的选择。 – 2013-04-08 14:48:52

回答

1

最近可能的解决方案是REPLACE声明。这里是documentation for REPLACE

类似的问题,有人问MySQL Forumsrecommended(and only) answer是使用REPLACE

+0

是的,但那不是我正在寻找的东西 - 我不想替换数据库中的项目 - 如果它存在,我想一起摆脱它。 – 2012-07-15 19:56:16

+0

我想唯一的选择(如果上述是唯一可能的解决方案)在这种情况下将运行单独的语句 - 首先检查是否找到记录,然后根据结果添加或删除它。 – 2012-07-15 19:57:58

+0

或创建一个'BOOLEAN'或'ENUM'列并将其设置为0或1,具体取决于您是否需要。 – hjpotter92 2012-07-15 20:00:23

4

使用REPLACE INTO

replace into some_table 
select somecolumn from othertable 

要么插入新的数据,或者是否存在THR相同的数据将删除数据,并插入新的

+1

vs vs DUPLICATE UPDATE的性能不同。 REPLACE INTO不会更新记录 - 它会删除记录并重新添加,如果涉及大量数据和索引,则可能需要一段时间...最好使用ON DUPLICATE UPDATE,但他要求删除ON DUPLICATE DELETE – 2013-08-27 08:25:24

-2

是当然还有MySQL中的解决方案,为您的问题。

如果你想删除或跳过新插入的记录,如果有已经重复记录在表中的键列存在,您可以用忽略这样的:

insert ignore into mytbl(id,name) values(6,'ron'),(7,'son'); 

这里id列是主键在表mytbl中。这将通过删除或跳过新的重复记录在表中插入多个值。

希望这能满足您的要求。

+1

插入忽略不会删除任何东西 – 2015-09-25 13:59:35

5

这是一个变通办法,但它的工作原理:

创建一个新的列,并调用它do_delete,或什么的,使其成为一个微小的-INT。然后做On Duplicate Key Update do_delete = 1;

根据你的MySQL版本/连接,你可以在同一个语句中执行多个查询。但是,如果不是,只需在后面单独运行一个单独的查询。无论哪种方式,下一个查询将只是:Delete From [table] Where do_delete = 1;。这样,如果它是一个新的条目,它不会删除任何东西。如果它不是新条目,则会将其标记为删除,然后您可以将其删除。

+0

我喜欢这个选项 - 并且不需要更改我的更新语句。 – ChiMo 2016-07-05 23:16:36