Mysql 如何在phpMyAdmin中合并两个表,以便在';不能重复输入吗?

Mysql 如何在phpMyAdmin中合并两个表,以便在';不能重复输入吗?,mysql,merge,Mysql,Merge,这对我来说有点复杂,我正在尽我最大的努力。我有一个带引号的数据库。在这个数据库中,我有四个表,其中两个是从其他数据库导入的。现在我想把这些表合并成两个表。表是author和author\u new以及quotes和quotes\u new。我想合并作者和引号,但问题是它们之间有某种关系,比如每个作者都有一个Id,这个Id用冒号auth\u Id加引号表示 Id为1的作者有10个或更多引用,每个引用都有auth_Id 1 现在,如果我们合并来自author_的作者id,则new将更改,因此引号中的

这对我来说有点复杂,我正在尽我最大的努力。我有一个带引号的数据库。在这个数据库中,我有四个表,其中两个是从其他数据库导入的。现在我想把这些表合并成两个表。表是author和author\u new以及quotes和quotes\u new。我想合并作者和引号,但问题是它们之间有某种关系,比如每个作者都有一个Id,这个Id用冒号auth\u Id加引号表示

Id为1的作者有10个或更多引用,每个引用都有auth_Id 1 现在,如果我们合并来自author_的作者id,则new将更改,因此引号中的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

如果我们忽略“authors”可能同时出现在
author
author\u 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)
);
接下来,将
author
author\u new
中的数据复制到
author\u 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;
然后,您将需要创建要使用的最终结构(我刚刚使用了从您的示例中提取的相同简单结构)

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

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

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');
我已经创建了一个执行这些步骤的


在我总结示例步骤时,您回答了我的评论,我将简单描述仅基于用户名实际合并
author
author\u new
的过程

主要的变化是中间
author\u 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
查询中更改条件,以使用适当的
authorId
authorNewId


不愿意创建一个新的提琴,因为我不喜欢所有caps的评论,但是,这完全符合您的要求(您应该做正确的事情并更新问题以反映这一新的要求)。

我认为如果您想保持关系,您必须手动操作,因为您可以向我们展示4个表格(不需要真实数据)所以我们可以在mysql fiddle上做这件事?brother它不是一个两个条目它有20万个引号和2万个作者..这怎么可能?我肯定我只是在创建表..在
author\u new
中id为3的“Jack”应该与
author
中id为1的“Jack”合并吗?或者这些可以被认为是不同的吗?伙计,如果作者的名字相同呢在《作者》和《作者新闻》中都有,我建议你通读到底(并点击caps lock一次)你能在mysql fiddle中进行更改并得到准确的结果吗?…是的,最终查询插入引号\u final没有显示准确的结果,只插入了引号中的引号\u new,其他引号没有插入。我不确定我是否理解你的意思,我必须证明引号都来自
引号
quotes\u new
(在
quotes\u new
的fiddle quotes中,现在已经附加了
'new'
)。对于其余部分,您想知道如何合并表,我觉得我已经为您回答了。创建语句以迁移数据现在取决于您。我相信我已经回答了您的问题(包括更新的需求),现在轮到你从中学习并解决你的问题了。
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;