使用WHERE语句循环插入INSERT INTO表(填充外键列)

时间:2019-04-27 17:18:32

标签: php mysql

我正在尝试为学校项目创建数据库,并且必须使用多个外键。我已经添加了原始数据,并且想知道如何动态填充外键列。

例如,我有一个city表和一个country表。 city表具有一个country_id列,其中将包含id表中右侧条目中的country

目前,表city包含以下列:

id

name

code(就像美国和美国的“美国”都具有相同的信息,我正在考虑将其用作带有WHERE语句的标识符)

country_id

我是mySql的一个完整的初学者,现在感觉完全迷失了!

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

在归一化之前,可以使用一个平面文件来描述城市和州数据:

id city       code country
 1 Amsterdam  NED  Netherlands
 2 Anvers     BEL  Belgium
 3 Athènes    GRE  Greece
 4 Atlanta    USA  United States
 5 Barcelone  ESP  Spain

对于此数据,无需更多的标准化。实际上,这会适得其反。

但是,如果您想存储每个城市记录中都不想重复的国家信息,该怎么办?也就是说,您想保持人口规模,犯罪率,货币名称……等等。您不希望将这些信息与引用该国家的每条记录一起存储。那将是很多重复的信息,如果您想更新该国家/地区的数据,则必须在该国家/地区拥有城市的每条记录中进行更改。

这是外键概念发挥作用的地方。您可以将其分为两个不同的表:城市和国家。特定于城市的信息(城市名称等)进入城市表,特定于国家/地区的信息(国家/地区,货币名称等)进入国家表。

但是现在,我们如何填充表格?

在基于Web的环境中,通常,您将具有一个数据输入页面,该页面将输入城市名称,并为该国家/地区提供一个下拉框(或AJAX查找),其值为该国家/地区的ID名称。这样,当您提交城市和国家/地区对时,您将具有要插入的国家/地区ID和城市名称。

但是在这种情况下,您已经填充了城市和国家/地区表。为了使用国家ID更新城市表,您必须能够加入表。幸运的是,您在国家/地区代码中有一个这样的字段。这是一次很不幸的事故,因为这实际上是重复的信息,不应该在城市表中显示……更不用说依靠varchar字段进行联接不是一个好主意(很难保证值是相同的) )

但是既然它在那里,我们就来使用它吧!

首先,如何连接桌子?您可以将他们加入他们共享的领域。

给出:

City:
id  name      code  country_id 
 1 Amsterdam  NED 
 2 Anvers     BEL 
 3 Athènes    GRE 
 4 Atlanta    USA 
 5 Barcelone  ESP 


 Country
 id  name       code 
  1 Afghanistan AFG 
  2 Albanie     ALB 
  3 Algérie     ALG 
  4 Andorre     AND 
  5 Angola      ANG 
  ...
  20 Belgium    BEL
  ...
  30 Netherlands NED
SELECT CITY.*, COUNTRY.*
FROM CITY
INNER JOIN COUNTRY ON CITY.CODE = COUNTRY.CODE

结果(只有两个与我显示的结果集匹配):

 1 Amsterdam  NED null 30 Netherlands NED
 2 Anvers     BEL null 20 Belgium     BEL  

现在您可以连接两个表,然后可以基于该数据更新城市表。 MySql有自己的方式做到这一点:

UPDATE CITY
INNER JOIN COUNTRY ON CITY.CODE=COUNTRY.CODE
SET CITY.COUNTRY_ID = COUNTRY.ID

(请参见MySQL - UPDATE query based on SELECT Query

答案 1 :(得分:0)

您只需从城市表中选择所有城市,然后获取代码并将其与国家/地区表进行比较,找到匹配项后,将country_id插入城市表中即可。希望对您有帮助。