上下文 我在mysql数据库中有一个表格,其格式如下。每行是一天股票价格和交易量数据
Ticker,Date/Time,Open,High,Low,Close,Volume
AAA,7/15/2010,19.581,20.347,18.429,18.698,174100
AAA,7/16/2010,19.002,19.002,17.855,17.855,109200
BBB,7/19/2010,19.002,19.002,17.777,17.777,104900
BBB,7/19/2010,19.002,19.002,17.777,17.777,104900
CCC,7/19/2010,19.002,19.002,17.777,17.777,104900
....100000 rows
此表是通过使用相同的列和格式从多个* .txt文件导入数据而创建的。 * .txt文件名与股票代码栏中的股票代码名称相同:即:导入AAA.txt获取2行AAA数据。
所有这些* .txt文件都是由我国检索股票价格的系统自动生成的。每天股市收盘后,根据新一天的数据,.txt文件将有一个新行。
问题:每天,如何将每个txt文件中的新行更新到数据库中,我不想每天在mysql表中的.txt文件中加载所有数据,因为它需要很多时候,我只想加载新行。
我应该如何编写代码来执行此更新任务。
答案 0 :(得分:0)
(1)创建/使用一个空的舞台表,没有prmary ...:
create table db.temporary_stage (
... same columns as your orginial table , but no constraints or keys or an index ....
)
(2)#这应该非常快
LOAD DATA INFILE 'data.txt' INTO TABLE db.temporary_stage;
(3)加入id然后使用哈希函数来消除所有未更改的行。以下内容可以做得更好,但是当你有很多行时,使用批量加载数据库的速度要快得多,而这主要取决于数据库如何在内部移动内容。它可以同时更有效地维护,而不是一次一点。
UPDATE mytable SET
mytable... = temporary_stage...
precomputed_hash = hash(concat( .... ) )
FROM
(
SELECT temporary_stage.* from mytable join
temporary_stage on mytable.id = temporary_state.id
where mytable.pre_computed_hash != hash(concat( .... ) ) )
AS new_data on mytable.id = new_data.id
# clean up
DELETE FROM temporary_stage;