两个相同的mysql表,一个是空的,如何填充它?

时间:2013-11-06 18:35:20

标签: mysql database

我有一个数据表(大约20,000个值)

table_1

ID | name | e-mail (only as an example, it could be just normal TEXT)
1  |alfaa | e-mail alfaa 1
2  |alfaa | e-mail alfaa 2
3  |beta  | e-mail beta
4  |celta | e-mail celta
...

和其他相同的表格,其中“电子邮件”列为空,并且某些名称也包含在table_1中,所有这些名称都具有不同的ID为

table_2 (around 5,000 values)

ID | name | e-mail
1  |beta  |
2  |alfaa |
3  |celta |
...

我的问题是,如何使用table_1 WHERE table_2.name = table_1.name?

的电子邮件列中的值填充table_2的空电子邮件列

ID不同而且table_1包含一些同名电子邮件的情况。

(好吧,我想我也可以管理它,没有几个同名的电子邮件)

3 个答案:

答案 0 :(得分:0)

这就是我所拥有的:

UPDATE table_2, table_1
SET table_2.email = table_1.email
WHERE table_1.name = table_2.name;

请参阅此sqlfiddle

答案 1 :(得分:0)

我们来谈谈Database Normalization

您发现数据库架构的设计方式存在问题,主要是您在多个位置存储了大量数据。这很容易导致表格彼此不同步,浪费存储空间和昂贵的查找。

让我告诉你我在说什么。


案例1.同步表。

假设您正确填充了table_1,table_2。你得到这样的东西:

table_1                        table_2

ID_1 | name | email            ID_2 | name | email
1    | bob  | bob@cat.com      1    | adam | adam@dog.com
2    | adam | adam@dog.com     2    | bob  | bob@cat.com
3    | bob  | bob@dog.com      3    | bob  | bob@dog.com
4    | joe  | joe@dog.com

请注意,我正在两次存储bob的两封电子邮件。这可能看起来不多,但如果bob有5封电子邮件,并且您添加了table_3,那么您将存储15条记录,仅引用5条独特的信息。

现在让我们说你是adam,并且你想要更新你的电子邮件,假设你想要将你的电子邮件更改为adam@cat.com。你在使用table_1的程序1中执行此操作,但在程序2中不使用table_2。点击更新后你会得到什么?

table_1                        table_2

ID_1 | name | email            ID_2 | name | email
1    | bob  | bob@cat.com      1    | adam | adam@dog.com
2    | adam | adam@cat.com     2    | bob  | bob@cat.com
3    | bob  | bob@dog.com      3    | bob  | bob@dog.com
4    | joe  | joe@dog.com

Adam现在有一个不同的电子邮件,具体取决于他是使用程序1还是程序2.所以要解决这个问题,每次更改table_1中的内容时都需要经过table_2,这是一个额外的数据库调用。


案例2.内部一致性

现在让我们说鲍勃想把他的名字改成吉尔。现在发生了什么?

table_1                        table_2

ID_1 | name | email            ID_2 | name | email
1    | jill | bob@cat.com      1    | adam | adam@dog.com
2    | adam | adam@dog.com     2    | bob  | bob@cat.com
3    | bob  | bob@dog.com      3    | bob  | bob@dog.com
4    | joe  | joe@dog.com

哎呀,我不小心只更新了表1中与bob相对应的一行,现在看来bob@cat.com和bob@dog.com是两个不同的人,当他们实际上是相同的时候。所以我必须浏览整个数据库并检查name = "bob"的每一行。然后我必须为table_2做同样的事情。您的数据库很快变得无法管理。


数据库规范化

而不是有两个表。

table_1                        table_2

ID_1 | name | email            ID_2 | name | email
1    | bob  | bob@cat.com      1    | adam | adam@dog.com
2    | adam | adam@dog.com     2    | bob  | bob@cat.com
3    | bob  | bob@dog.com      3    | bob  | bob@dog.com
4    | joe  | joe@dog.com

获取两个表共有的信息,即名称 - 电子邮件对,并将其放在用户表中

table_1          table_2          user

ID_1 | userId    ID_2 | userId    userId | name | email
1    | 2         1    | 1         1      | adam | adam@dog.com
2    | 1         2    | 2         2      | bob  | bob@cat.com
3    | 2         3    | 2         2      | bob  | bob@dog.com
4    | 3                          3      | joe  | joe@dog.com

这解决了很多问题,现在当你想要查找用户的名字/电子邮件时,你可以在基于userId的用户表中查找它。如果adam更改了他的电子邮件,则会更改两个表(因为它们都引用用户表)。

还有一件事,如果bob改变了他的名字,我们不应该通过整个用户表来改变他名字的每一个场合。所以我们可以更进一步。

table_1          table_2          user              email

ID_1 | userId    ID_2 | userId    userId | name     userId | email
1    | 2         1    | 1         1      | adam     1      | adam@dog.com
2    | 1         2    | 2         2      | bob      2      | bob@cat.com
3    | 2         3    | 2         3      | joe      2      | bob@dog.com
4    | 3                                            3      | joe@dog.com

现在我们没有任何冗余的信息,不需要复制值,任何一个地方的更改都会影响引用它的每个其他表。

答案 2 :(得分:0)

@remram:谢谢,它有效。我直接尝试使用PhpMyAdmin。

一些小修改:

UPDATE table_2, table_1
SET table_2.`email` = table_1.`email`
WHERE table_1.`name` = table_2.`name`;

@HansZ:还要感谢DataBase规范化解释。 在这种情况下,remram解决方案是我需要的。我在MySQL中寻找一种模糊VLOOKUP,这将是一种获得我想要的方式

http://denglishbi.wordpress.com/2011/05/15/microsoft-fuzzy-lookup-add-in-for-excel-2010-walkthrough/

这里有一个小解释:我有一个需要翻译的单词列表。其中一些单词已经在Master中,Slave数据库是空的...最后,我只需要翻译空值