需要建立的关联表如上图所示。
好,问题来了,大伙儿请看:我们的organizations表中的Industry字段居然存储了两个IndustryName,这就很恶心了,就需要我们进行拆分和去重后放到Industry表中,完成Industry表后再使用关联查询找到我们的IndustryID。
CREATE TABLE organization_2 LIKE organizations;
INSERT INTO organization_2 SELECT * FROM organizations;
我们创建一个新的表organization_2,copy organizations的所有数据。(去掉之前为organizationID创建的主键)然后使用SUBSTRING_INDEX函数将所有 ‘ / ’ 后的数据放到表尾:
INSERT INTO organization_2 (OrganizationID, Industry)
SELECT OrganizationID, SUBSTRING_INDEX(Industry, '/', -1)
FROM organization_2
WHERE Industry LIKE '%/%';
删除organization_2表中 ‘ / ’ 后所有数据
UPDATE organization_2 SET Industry = SUBSTRING_INDEX(industry, '/', 1)
WHERE Industry LIKE '%/%';
此时我们可以得到Industry字段,我们直接插入到Industry表中
insert into industry(IndustryName)
select Industry from organization_2
注意:这里不在赘述建表,可以在最初建立Industry表时创建一个无自增主键的表,只包含IndustryName。
去重与roles表一样,采用外套子查询(建立临时表)方法:
DELETE FROM industry
WHERE IndustryID NOT IN (
SELECT min_id FROM (
SELECT MIN(IndustryID) AS min_id
FROM industry
GROUP BY IndustryName
) AS tmp
);
在organization_2中新建一个IndustryID字段:
alter table organization_2 add industryID int;
由于此时我们的organization_2表已经具有了Industry所需要的所有的两个字段,所以我们只需要简单的使用一个联表UPDATE就可以为IndustryID赋值。
UPDATE organization_2 o INNER JOIN Industry i
ON o.Industry = i.IndustryName
SET o.industryID = i.industryID;
最后将数据插入关联表,即可:
INSERT INTO organizationindustry (organizationid, industryid)
SELECT OrganizationID, IndustryID
FROM organization_2;
这只是我的解法,字段类型设置,字段名可能不与你一样,思路仅供参考,sql语句自用需要根据自身表结构进行修改,直接抄是跑不了的。