【问题标题】:How to merge two tables in phpMyAdmin such that there won't be duplicate entry?如何在 phpMyAdmin 中合并两个表,以免出现重复条目​​?
【发布时间】:2016-03-08 09:32:18
【问题描述】:

这对我来说解释起来有点复杂,我正在尽力而为。我有一个带有名称引号的数据库。在这个数据库中,我有四个表,其中两个是从其他数据库导入的。现在我想将这些表合并为 2 个表。表是 author 和 author_new 以及 quotes 和 quotes_new。我想将authors_new 合并到authors 并将quotes_new 合并到quotes,但问题是它们之间存在某种关系,例如每个作者都有一个ID,并且该ID 是在带有coloumn auth_id 的引号中给出的。

Id 为 1 的作者有 10 条或更多引文,每条引文的 auth_id 为 1 现在,如果我们从 author_new 合并作者的 id 将会改变,所以引用中的 auth_id 也会改变,并且作者与引用的关系将不会保持。所以请建议我一些答案,我也可以在其中合并数据并且关系也将保持不变。希望你能理解我的问题。

这里是用于理解场景的示例表

        author

       id      | author_name    | 
       -------------------------------------
       1          Jack
       2          John     
       3          Jill   
       4          Mack

       author_new

    id      | author_name    | 
    ------------------------------------>merge this in author
     1           Harry
     2           Micky     
     3           Jack  



      quotes

      id      |quotes      | auth_id
      -------------------------
       1         i love...     2
       2         i am .....    1
       3         i was....     2
       4         we are....    3


       quotes_new

       id      |quotes      | auth_id
       --------------------------------->merge this in quotes
       1         we  wil...     2
       2         i  am .....    1
       3         we know...     2





       Result After merging


    author

   id      | author_name    | 
   ---------------------------------
    1          Jack
    2          John     
    3          Jill   
    4          Mack
    5          harry
    6          Micky


     quotes

    id      |quotes      | auth_id
     -------------------------
     1         i love...     2
     2         i am .....    1
     3         i was....     2
     4         we are....    3
     5         we  wil...    5
     6         i  am .....   6

【问题讨论】:

  • 如果你想保持关系,我认为你必须手动完成
  • 你能告诉我们这 4 个表(不需要真实数据),这样我们就可以在 mysql fiddle 上做吗?
  • 兄弟,它不是一个两个条目,它的 200 万个引用和 20000 个作者......这怎么可能
  • 你确定我只是在创建表格...
  • 应该将author_new 中id 为3 的'Jack' 与author 中id 为1 的'Jack' 合并,还是可以认为它们不同?

标签: mysql merge


【解决方案1】:

如果我们忽略“作者”可能同时在authorauthor_new 表中这一事实,那么数据的迁移非常简单,只需要采取几个步骤:

首先,创建中间表,其中将包含原始表和新表的所有数据,这使您能够拥有新的 id。

CREATE TABLE author_origin (
  id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  originTable VARCHAR(16),
  originId INT(11),
  name VARCHAR(32),
  PRIMARY KEY(id)
);
CREATE TABLE quotes_origin (
  id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  originTable VARCHAR(16),
  originId INT(11) UNSIGNED,
  authorId INT(11) UNSIGNED,
  quote VARCHAR(128),
  PRIMARY KEY(id)
);

接下来,将authorauthor_new 中的数据复制到author_origin 中,对于报价表也是如此。

INSERT INTO author_origin (originTable, originId, name)
SELECT 'author', id, name
  FROM author;
INSERT INTO author_origin (originTable, originId, name)
SELECT 'author_new', id, name
  FROM author_new;

INSERT INTO quotes_origin (originTable, originId, authorId, quote)
SELECT 'quotes', id, authorId, quote
  FROM quotes;
INSERT INTO quotes_origin (originTable, originId, authorId, quote)
SELECT 'quotes_new', id, authorId, quote
  FROM quotes_new;

然后,您需要创建最终将使用的结构(我只是使用了从您的示例中提取的相同简单结构)

CREATE TABLE author_final (
  id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  name VARCHAR(32),
  PRIMARY KEY(id)
);
CREATE TABLE quotes_final (
  id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  authorId INT(11) UNSIGNED,
  quote VARCHAR(128),
  PRIMARY KEY(id)
);

现在,剩下的就是将数据复制到“最终”表格中。 作者非常直截了当(只跳过“来源”字段)

INSERT INTO author_final
SELECT id, name
  FROM author_origin;

引号稍微麻烦一些,因为你需要引用新生成的authorId的

INSERT INTO quotes_final
(SELECT q.id, a.id, q.quote
  FROM quotes_origin q
 INNER JOIN author_origin a 
    ON a.originTable = 'author' AND a.originId=q.authorId
 WHERE q.originTable = 'quotes')
 UNION
 (SELECT q.id, a.id, q.quote
  FROM quotes_origin q
 INNER JOIN author_origin a 
    ON a.originTable = 'author_new' AND a.originId=q.authorId
 WHERE q.originTable = 'quotes_new');

我已经创建了一个 working fiddle 来执行这些步骤


在我整理示例步骤时,您几乎回答了我的评论,我将简单描述仅基于用户名实际合并 authorauthor_new 的过程。

主要的变化是让中间 author_origin 中的 name 字段是唯一的,并为原始表提供单独的字段,类似于

CREATE TABLE author_origin (
  id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  name VARCHAR(32),
  authorId INT(11) UNSIGNED,
  authorNewId INT(11) UNSIGNED,
  PRIMARY KEY(id),
  UNIQUE KEY (name)
);

然后您需要根据原始表更新适当的字段,例如

INSERT INTO author_origin (name, authorNewId)
SELECT name, id
  FROM author_new
ON DUPLICATE KEY
UPDATE authorNewId=id;

从那时起,只需将最终UNION 查询中的条件更改为使用适当的authorIdauthorNewId

不愿意创建一个新的小提琴,因为我不欣赏全大写 cmets,仍然是 here's a working fiddle,它完全按照您的雄辩要求(您应该做正确的事情并更新问题以反映这一新要求)。

【讨论】:

  • 好友如果同名作者同时出现在 AUTHOR 和 AUTHOR_NEW 中会怎样
  • 我建议你通读到最后(并点击一次大写锁定)
  • 您能否在 mysql fiddle 中进行更改并获得确切的结果....是的,插入 quote_final 的最终查询未显示准确结果,仅插入了来自 quotes_new 的引号,其他引号未插入插入
  • 我不确定我是否理解你的意思,我已经 updated the fiddle 证明引号都来自 quotesquotes_new(在 quotes_new 的小提琴引号中现在有' new' 附加到它们)。剩下的,你想知道如何合并表格,我觉得我已经为你回答了。现在由您来创建用于迁移数据的语句。我相信我已经回答了您的问题(包括更新的要求),现在轮到您学习并解决您的问题了。
猜你喜欢
  • 1970-01-01
  • 2013-03-24
  • 1970-01-01
  • 2012-09-25
  • 2018-04-16
  • 2012-03-16
  • 1970-01-01
  • 1970-01-01
  • 2013-09-12
相关资源
最近更新 更多