带有INSERT的mysqldump…ON重复


21

我想将数据从一个数据库合并到另一个数据库。因此,我使用创建转储,mysqldump然后将其导入到另一个数据库(具有相同的表结构)。在这种情况下,我没有任何问题(例如重复的条目或其他东西)。

但是我出于测试目的进行了一些合并,稍后将进行最终合并。因此,我想执行几次合并(数据可能会更改)。请注意,我表中的行永远不会删除,只能插入或更新。

我可以使用ON DUPLICATE选项创建mysqldump吗?还是可以合并插入新数据并更新修改后数据的转储?

当然,我可以ON DUPLICATE手动插入转储中,但是我想使合并过程自动化。

Answers:


34

有一些选项可以帮助您:

  --insert-ignore     Insert rows with INSERT IGNORE.
  --replace           Use REPLACE INTO instead of INSERT INTO.
  -t, --no-create-info
                      Don't write table creation info.

记住这种范例

  • mysqldump从DB1到DUMP1的所有内容
  • 将DUMP1装入DB3
  • mysql使用--replace(或--insert-ignore)和--no-create-info将DB2中的所有内容转储到DUMP2中
  • 将DUMP2装入DB3

1
等一下:使用--replace表示DB2数据将覆盖DB1数据,使用--insert-ignore表示以DB1数据为准。问题似乎是在重复键的情况下询问如何执行UPDATE。无论如何,我想知道。
爱德华·纽厄尔2014年

@EdwardNewell请注意,这--replace等同于ON DUPLICATE UPDATE在每一列上执行。不幸的是,由于mysqldump具有批量加载和转储特性,因此mysqldump不能设计为更新特定的列。我的答案只是揭示了mysqldump的功能。除了mysqldump之外,您还必须编写自定义代码来执行ON DUPLICATE UPDATE
RolandoMySQLDBA 2014年

只要DB1和2具有完全相同的架构,您就是对的。但是,假设DB1有额外的字段。然后--replace将使多余的字段恢复为默认值(如果没有默认值,则为错误),而不仅仅是更新共享字段。我意识到了OP的情况是两个数据库具有相同的架构,而只是指出存在差异,并且这将是在某些情况下,真正的更新型倾卸有用的(我现在面临一个!)
Edward Newell 2014年

1
请注意,如果有外键指向要更新的记录,则使用REPLACE INTO可能会失败,因为无法通过切断这些关系来删除该记录。如果您有ON DELETE CASCADE,那么您将清空那些依赖于要更新的​​表的表。REPLACE INTO是相当危险的操作。
Christopher Schultz 2014年

1
@RolandoMySQLDBA同意。我只是想发表评论,以便任何阅读此答案的人都理解这些选项(尤其是REPLACE INTO)可能很危险,并且会产生“令人惊讶的”效果。好的答案-只是想添加一个警告。
Christopher Schultz
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.