我正在从一个数据库到另一个数据库实现特定于应用程序的数据导入功能。
我有一个包含10000行的CSV文件。需要将这些行插入/更新到数据库中。
我正在使用mysql数据库并从Java插入。
可能存在这样的情况:数据库中可能存在几行,这意味着需要更新这些行。如果数据库中不存在,则需要插入。
一种可能的解决方案是,我可以逐行阅读,检查数据库中的条目并相应地构建插入/更新查询。但是,此过程可能需要很长时间来创建更新/插入查询并在数据库中执行它们。有时我的CSV文件可能有数百万条记录。
有没有其他更快的方法来实现此功能?
答案 0 :(得分:1)
我不知道你如何确定“已经存在”,但如果它是任何类型的数据库级别约束(可能在主键上?),你可以使用REPLACE INTO语句,这将创建一条记录,除非它会收到一个错误,在这种情况下它会更新阻止它被插入的记录。
它基本上就像INSERT一样:
REPLACE INTO table ( id, field1, field2 )
VALUES ( 1, 'value1', 'value'2 )
如果存在ID为1的行,则使用这些值进行更新;否则它就被创造了。
答案 1 :(得分:1)
鉴于您正在使用MySQL,您可以使用INSERT ... ON DUPLICATE KEY UPDATE ...
语句,该语句的功能与SQL标准MERGE
语句类似。 MYSQL doc reference here和general Wikipedia reference to SQL MERGE functionality here。该陈述看起来像
INSERT INTO MY_TABLE
(PRIMARY_KEY_COL, COL2, COL3, COL4)
VALUES
(1, 2, 3, 4)
ON DUPLICATE KEY
UPDATE COL2 = 2,
COL3 = 3,
COL4 = 4
在这个例子中,我假设PRIMARY_KEY_COL是MY_TABLE上的主键或唯一键。如果INSERT语句由于主键或唯一键上的重复值而失败,则执行UPDATE子句。另请注意(在MySQL doc page上)有一些与InnoDB表上的自动增量列相关联的问题。
分享并享受。
答案 2 :(得分:0)
在SQL中添加存储过程以进行插入。在存储过程中使用try catch块来执行插入操作。如果插入失败,请执行更新。然后,您只需从程序中调用此方法即可。
可替换地:
UPDATE Table1 SET (...) WHERE Column1='SomeValue'
IF @@ROWCOUNT=0
INSERT INTO Table1 VALUES (...)
答案 3 :(得分:0)
您是需要经常这样做还是偶尔做一次? 我需要不时地将csv文件加载到数据库进行分析,我创建了一个带有数据流任务的SSIS-Datasolution,它将csv-File加载到SQL Server上的表中。
有关更多信息,请查看此博客 http://blog.sqlauthority.com/2011/05/12/sql-server-import-csv-file-into-database-table-using-ssis/