Mysql 如何在phpMyAdmin中合并两个表,以便在';不能重复输入吗?
这对我来说有点复杂,我正在尽我最大的努力。我有一个带引号的数据库。在这个数据库中,我有四个表,其中两个是从其他数据库导入的。现在我想把这些表合并成两个表。表是author和author\u new以及quotes和quotes\u new。我想合并作者和引号,但问题是它们之间有某种关系,比如每个作者都有一个Id,这个Id用冒号auth\u Id加引号表示 Id为1的作者有10个或更多引用,每个引用都有auth_Id 1 现在,如果我们合并来自author_的作者id,则new将更改,因此引号中的auth_id也将更改,并且作者与引号的关系将不会保持。因此,请给我一些答案,我可以合并的数据也和关系也将保持。希望你能理解我的问题 下面是用于理解该场景的示例表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
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;