MySQL数据库遇到不规范建表问题解决方案

发布时间:2023年12月17日

简介:

需要建立的关联表如上图所示。

问题发现:

好,问题来了,大伙儿请看:我们的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语句自用需要根据自身表结构进行修改,直接抄是跑不了的。

文章来源:https://blog.csdn.net/weixin_74783792/article/details/135029408
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。