对于工作,我正在处理一个大型数据库(每年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引擎。
答案 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中执行任何操作。
当然,如果这个列表很大,你可能不想这样做,因为它会吸收相当多的内存。