求个批量插入数据库的方案

有两表:

CREATE TABLE `database1`.`product`  (
  `id` char(36) NOT NULL COMMENT 'uuid',
  `name` varchar(255) NOT NULL COMMENT '产品名称',
  `cate_id` char(36) NOT NULL COMMENT '类别ID',
  PRIMARY KEY (`id`),
  CONSTRAINT `fk_product_cate` FOREIGN KEY (`cate_id`) REFERENCES `database1`.`cate` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
);

CREATE TABLE `database1`.`cate`  (
  `id` char(36) NOT NULL COMMENT 'uuid',
  `name` varchar(255) NOT NULL unique COMMENT '类别名称',
  PRIMARY KEY (`id`),
);

下面有些数据(来自excel):

产品名称产品类别
塑化剂化学物品
光敏电阻电感元件
压敏电阻电感元件

假设!假设!这个表格有几百万几千万行的数据
要把这些数据插入到product表,名称对应product.name,类别对应外键product.cate_id
类别已存在cate表中,不需要插入数据,只需要插入product表数据并设置对应的类别ID。
综合效率与性能考虑,怎样插入数据比较好?
小弟笨拙,只想到这个方法:

  1. 先插入所有类别

    • 每插入一行数据就查询一次cate表 (很明显,这个...)
    • 或者 把cate表的数据全拿出来,然后做好相应结构的数据再插入

不知有没更优的方法

阅读 1.2k
2 个回答

第二种方案不行吗?

如果能保证类别数据的正确性,可以先将product表的外键约束干掉,先插入数据后再添加外键约束

如果是一次性操作,可以先建个临时表

create temporary table tmp_product
(
  `name` varchar(255) NOT NULL COMMENT '产品名称',
  `cate_name` varchar(255) NOT NULL unique COMMENT '类别名称',
)

把数据导入进去,再join插入到product表(cate表最好先加个name的索引)

insert into product(name,cate_id)
select t1.name,t2.id
from tmp_product t1 
left join cate t2 on t1.cate_name=t2.name
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题