1

我正在为报告进行 mysql 查询。这个想法是有一个简单的表说'reportTable',其中的值是从各个地方获取的。然后我可以更轻松地使用 reportTable 而无需记住大量的连接等,并且还可以为其他项目共享此表。

  1. 我是否应该分解查询的内部插入部分,以便它一次执行块,我可能会添加数万行?

INSERT INTO reportTable
(
   -- long query grabbing results from various places
   SELECT var1 FROM schema1.table1
   SELECT var2 FROM schema2.table1
   SELECT var2 FROM schema2.table1
   etc
)
4

2 回答 2

1

这解决了您对插入数据需要太长时间等的担忧。我理解它就像你每次都重建你的桌子。因此,不要这样做,只需获取表中尚未包含的新数据。由于查找数据是否已经存在于您的报告表中可能也很昂贵,因此只需获取增量即可。就是这样:

确保在每个表中都需要这样的列:

ALTER TABLE yourTable ADD COLUMN created timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

ON UPDATE子句当然是可选的,不知道是否需要跟踪变化。如果是这样,请给我评论,我可以为您提供一个解决方案,您可以使用该解决方案保留您的数据历史记录。

现在您需要一个包含一些元信息的小表。

CREATE TABLE deltameta (tablename varchar(50), LSET timestamp, CET timestamp);

LSET 是 Last Success Extraction Time 的缩写,CET 是 Current Extraction Time 的缩写。

当您获取数据时,它的工作方式如下:

UPDATE deltameta SET CET = CURRENT_TIMESTAMP WHERE tablename = 'theTableFromWhichYouGetData';
SELECT @varLSET := LSET, @varCET := CET FROM deltameta WHERE tablename = 'theTableFromWhichYouGetData';
INSERT INTO yourReportTable (
    SELECT whatever FROM aTable WHERE created >= @varLSET AND created < @varCET
);
UPDATE deltameta SET LSET = CET WHERE tablename = 'theTableFromWhichYouGetData';

如果在插入脚本过程中出现任何问题,您将在下次运行时获得相同的数据。此外,如果您需要回滚,您可以在此处处理事务。同样,如果您需要帮助,请写评论。

于 2013-01-28T11:24:44.890 回答
0

我可能错了,但您似乎在谈论基本观点。您可以在此处阅读视图介绍:http: //techotopia.com/index.php/An_Introduction_to_MySQL_Views,这里是 mysql 视图文档:http ://dev.mysql.com/doc/refman/5.0/en/create -view.html

于 2013-01-24T17:43:50.137 回答