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

简介:

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

问题发现:

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

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Benaso

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值