【问题标题】:Is there a way to insert data and having references created automatically in sql?有没有办法插入数据并在 sql 中自动创建引用?
【发布时间】:2021-04-06 00:45:05
【问题描述】:

我还是 mysql 新手,希望在导入数据时节省时间,如下所示:

我想导入来自不同汽车经销商的汽车清单。 为了提高性能,我为汽车制造商和汽车模型创建了表格。 我现在正在寻找的是一种自动插入来自汽车经销商的数据的方法,包括在相应的表中添加汽车制造商和/或汽车型号以及生成相应的 ID 并将这些 ID 写入主表。 这是一个例子: 表 car_makers 包含

maker_id maker_name
1 Audi
2 Chrysler
3 Honda

表 car_models 包含

model_id model_name
1 100
2 A5
3 Civic
4 Voyager

然后我得到这个列表(缩写为只显示这个问题的重要部分):

car maker car model
Audi A5
Audi A3
Chrysler Pacifica
Volkswagen Beetle

应该插入

model_id model_name
5 A3
6 Pacifica
7 Beetle

进入 car_models 表并

maker_id maker_name
4 Volkswagen

到 car_makers 表中,然后按如下方式插入列表(maker_name 和 model_name 仅用于说明,它们不是主表的一部分)

maker_id maker_name model_id model_name
1 Audi 5 A3
1 Audi 2 A5
2 Chrysler 6 Pacifica
4 Volkswagen 7 Beetle

这样,新的制造商/型号将自动添加到这两个表中,并且只会将所需的参考 ID 插入到主表中。

我仍然可以检查这两个表以查找错别字并在以后进行调整。

感谢您的任何建议!

【问题讨论】:

  • 请重新格式化以使其可读。
  • 抱歉,尝试使用所示结构将表格插入为表格,它在预览中有效,但在实际发布中似乎不起作用。

标签: mysql sql


【解决方案1】:

您可以分多个步骤执行此操作。假设您的新数据位于名为 staging 的表中,并且您在每个引用表中的名称上都有唯一索引:

insert into car_makers (maker_name)
    select distinct car_maker
    from staging
    on duplicate key update maker_name = values(maker_name);

insert into car_models (model_name)
    select distinct car_model
    from staging
    on duplicate key update model_name = values(model_name);

insert into main (model_id, maker_id)
    select cmo.model_id, cma.maker_id
    from staging s join
         car_makers cma
         on cma.maker_name = s.car_maker join
         car_models cmo
         on cmo.model_name = s.car_model;

注意:您不应将名称存储在主表中。名称可通过加入参考表获得。

【讨论】:

  • 即使您以文本文件的形式获取数据,也可以考虑将其存储到像 staging 这样的表格中,因为这样可以让整个导入过程变得更加容易。
  • 是否有“重复密钥更新”这一点?主键可能是一个 auto_increment,因此主要风险是当您尝试再次导入时,表中已经有一个特定的 make。那仍然会创建具有相同品牌但不同 ID 的第二行,不是吗?我的意思是,您在表中使用对“汽车制造商”的唯一约束来修复它,但不应该忽略它吗?
  • @AllanWind 。 . .我认为您缺少这部分答案:您在每个参考表中的名称上都有唯一索引
  • 谢谢,我试试看。当然,我不会将名称添加到主表中,那么拥有附加表的全部意义就消失了。 :) 这就是为什么我说它们只是为了澄清我的想法而添加的,但也许这比它澄清的更令人困惑。
  • @GordonLinoff 是的,我确实错过了,但这就是更新的意义所在?
猜你喜欢
  • 2020-03-25
  • 1970-01-01
  • 2022-08-14
  • 1970-01-01
  • 2010-12-04
  • 2020-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多