【问题标题】:MySQL insert on duplicate key; delete?MySQL 在重复键上插入;删除?
【发布时间】:2012-07-14 18:09:27
【问题描述】:

有没有办法在 MySQL 中删除重复键上的记录?

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

【问题讨论】:

  • 谢谢 - 我认为这是唯一的选择。

标签: mysql key duplicate-removal sql-delete


【解决方案1】:

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

MySQL Forums 上提出了类似的问题,recommended(and only) answer 是使用 REPLACE

【讨论】:

  • 是的,但这不是我想要的——我不想替换数据库中的项目——如果它存在,我想一起摆脱它。
  • 我猜在这种情况下唯一的选择(如果上面是唯一可能的解决方案)将运行单独的语句 - 首先检查是否找到记录,然后根据结果添加或删除它。
  • 或创建一个BOOLEANENUM 列并将其设置为0 或1,这取决于您是否愿意。
【解决方案2】:

使用REPLACE INTO:

replace into some_table
select somecolumn from othertable

将插入新数据,或者如果存在相同的数据将删除数据并插入新数据

【讨论】:

  • replace into 与 ON DUPLICATE UPDATE 的性能不同。 REPLACE INTO 没有更新记录 - 它删除记录并再次添加它,如果您涉及大量数据和索引,可能需要一段时间......最好使用 ON DUPLICATE UPDATE,但他要求删除类似 ON重复删除
【解决方案3】:

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

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

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

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

希望这能满足您的要求。

【讨论】:

  • 插入忽略不会删除任何内容
【解决方案4】:

这是一种变通方法,但它确实有效:

创建一个新列并将其命名为 do_delete 或其他任何名称,使其成为 tiny-int。然后做On Duplicate Key Update do_delete = 1;

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

【讨论】:

  • 我喜欢这个选项 - 并且不需要更改我的更新声明。
  • 绝妙的解决方案!谢谢
【解决方案5】:

使用 mySql 更清楚:
值可以来自同一个表:
replace into table1 (column1,column2) select (val1,val2) from table1



值可以来自另一个表:
replace into table1 (column1,column2) select (val1,val2) from table2



值可以来自任何具有条件的表:
replace into table1 (column1,column2) select (val1,val2) from table1 where <br>column3=val3 and column4=val4 ...




还记得值可以是静态的,带有同名的表名:
replace into table1 (column1,column2) select (123,"xyz") from table1

即使更新导致重复条目也不会引发错误,因为它将被替换。
(记住)只会增加自动增量值;

并且

如果您有数据类型为“TIMESTAMP”且“on update CURRENT_TIMESTAMP”的列,它将无效;

【讨论】:

    猜你喜欢
    • 2017-01-31
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多