使用另一个表的记录规范化MySQL表

时间:2011-09-29 04:23:35

标签: mysql normalization

我有两张桌子。城市表格未规范化,因为国家/地区信息是纯文本格式。我已将id_country添加到'city'表中(该列为空)。

我需要检查城市>国家/地区国家>国家/地区之间的匹配项,然后从国家/地区表中更新与id_country匹配的城市记录。最后,我将能够从城市表中删除“国家/地区”列。

城市表

  • id_city(1,2,3 ......)
  • city(华盛顿,瓜亚基尔,波恩......)
  • 国家(德国,厄瓜多尔,美国......)
  • id_country(目前为空)

国家/地区表

  • id_country(1,2,3 ......)
  • 代码(GE,EC,US ...)
  • 国家(德国,厄瓜多尔,美国......)

我不知道从哪里开始,以及是否可以使用SQL查询完成。我最初的想法是在php循环中搜索匹配,但这似乎是一个非常难的实现。

3 个答案:

答案 0 :(得分:1)

您可以在UPDATE语句中使用JOIN执行此操作。

UPDATE city c1 INNER JOIN country c2 ON c1.country=c2.country
SET c1.id_country=c2.id_country;

使用INNER JOIN可确保仅对具有匹配国家/地区价值的城市进行更新。

一旦你运行它,你将能够选择所有那些仍然具有空id_country的城市,以防其中一些不匹配。相反,一旦您确定所有城市都有id_country,您就可以从城市表中删除该列。

答案 1 :(得分:1)

  

城市表格未正常化,因为国家/地区信息是   用纯文本。

无意义。规范化并不意味着“用id号替换纯文本”。找一个教你的人,用尖锐的棍子戳他的眼睛。

您的真正的问题是“城市”加上“国家/地区”不足以识别城市,至少在美国是这样。我想在美国至少有十几个不同的城市名为“华盛顿”。

使用两个字母的国家/地区代码取代国家名称,而不是用ID号替换国家/地区名称。这些代码是人类可读的;在使用您的城市表的每个查询中,ID号都需要额外的JOIN。

答案 2 :(得分:0)

这样的事情应该有效:

UPDATE city set id_country = (SELECT country.id_country from country WHERE country.country = city.country)