MYSQL快速插入依赖于单独表中的标志

时间:2010-05-28 09:36:48

标签: mysql insert

对于工作,我正在处理一个大型数据库(每年1.6亿行,10年的数据)并且有一个窘境;我们上传的大部分数据都是空数据,我想阻止它上传。

有问题的数据本质上是空间的,所以我有一个这样的表:

idLocations (Auto-increment int, PK)
X (float)
Y (foat)
Alwaysignore (Bool)

在第二个表中用作引用,如下所示:

idLocations (Int, PK, "FK")
idDates (Int, PK, "FK")
DATA1 (float)
DATA2 (float)
...
DATA7 (float)

所以,理想情况下我想找到一种可以做类似的方法:

INSERT INTO tblData(idLocations, idDates, DATA1, ..., DATA7) VALUES (...), ..., (...)
WHERE VALUES(idLocations) NOT LIKE (SELECT FROM tblLocation WHERE alwaysignore=TRUE
ON DUPLICATE KEY UPDATE DATA1=VALUES(DATA1)

因此,对于我的大批输入数据(块中的250个值),请忽略idLocations与标记为alwaysignore的idLocations值匹配的插入。

有人有什么建议吗?

干杯。 -Stuart

其他细节:在半专用机器上运行MySQL,为表格运行MyISAM引擎。

2 个答案:

答案 0 :(得分:1)

INSERT
INTO    tbldata
SELECT  *
FROM    (
        SELECT  :id1 AS id, :data1 AS id
        UNION ALL
        SELECT  :id2 AS id, :data2 AS id
        UNION ALL
        …
        ) q
WHERE   q.id NOT IN
        (
        SELECT  id
        FROM    tbllocation
        WHERE   alwaysignore
        )
ON DUPLICATE KEY
UPDATE
SET     data1 = VALUES(data1),
        …

使用您的值替换子查询中的:id1:data1等。

答案 1 :(得分:0)

如果您要忽略的位置不是一个巨大的列表,您可以始终在客户端缓存这些位置,从而避免在这些情况下完全访问mysql?所以当程序启动时你会

SELECT `x`, `y` FROM `locations` WHERE `alwaysignore` = 1;

并缓存x / y,甚至可以像这样的字符串:“x_y”。然后在插入时,只需检查该值是否存在,如果存在,则不要在mysql中执行任何操作。

当然,如果这个列表很大,你可能不想这样做,因为它会吸收相当多的内存。