将CSV加载到多个表中以解决关键约束问题

时间:2018-09-05 08:35:47

标签: mysql stored-procedures

在MySQL中,是否可以将CSV加载到存储过程中,该存储过程又将填充多个表,每个表都具有外键依赖关系Exl-table1的主键将在table2中使用,而table2的主键将成为在table3中使用了吗?

示例- 在存储过程中要读取的包含5列的单个文件, 对于CSV文件中的每行/记录,使用column1和column2插入表1,获取主键,然后在表2中插入第3列和column4,获取主键,并使用table1的主键和table2的主键和coulmn5插入表3

我正在考虑以下选项-

  1. 有一个外部应用程序,可以读取CSV并传递 数据[CSV中的每一行]到带有prepare语句的存储过程,这将需要 后续插入所需表的操作。
  2. 加载CSV 到临时表中,并准备一个存储过程 语句,它将处理后续插入到 必需的表。
  3. 有一个读取CSV的外部应用程序, 并有一组准备好的语句可插入后续 表。但是,从外部获取主键,然后重新使用 会导致延迟。.

重新表述该问题以了解解决此问题的高效方法,如果可以加载CSV,我们该怎么做?

3 个答案:

答案 0 :(得分:1)

是-可以做到。我不认为应该采用这种方式,因为它将大量业务逻辑放入数据库中,这通常被认为是一件坏事。在数据库外部的应用程序中,这样做更容易,更好。

但是-问题是可以做到的。我可以通过将CSV加载到临时表中来完成此操作(因为在存储过程中似乎无法逐行读取)。然后,您可以遍历表中的所有行并执行所需的操作。

希望为您提供线索,助您一臂之力。

答案 1 :(得分:1)

否,请参见Appendix C1 - Restrictions on Stored Programs,它告诉您LOAD DATA不能在存储的例程中使用。

  

存储例程中不允许使用SQL语句

     

存储的例程不能包含任意SQL语句。下列   声明是不允许的:

     

锁定语句LOCK TABLES和UNLOCK TABLES。

     

更改视图。

     

加载数据和加载表。

同样,在documentation for prepared statements中,您会发现它显示以下内容

  

通常,SQL预准备语句中不允许的语句是   存储程序中也不允许。

,然后给出允许的语句的有用列表。不幸的是,您在存储程序的文档中找不到相同的列表(可能会更有用)。

答案 2 :(得分:0)

经过上述多种方法后,找到了一种最佳方法。将整体任务分为两个主要部分-拆分数据,加载表

  • 拆分-外部应用程序,用于将源文件拆分为多个CSV [匹配table1,table2和table3的架构]
  • 加载-使用 LOAD DATA INFILE (加载数据输入文件),这是填充表的最快方法。

[对于所有这些表,请对主键进行硬编码,而不要依赖于AUTO_INCREMENT]

感谢您的输入,建议和指示。