仅当值与多个插入的上一个记录不同时才插入?

时间:2015-03-06 12:23:52

标签: mysql sql

我无法透露我存储的实际数据类型,但想象一下,我有一个天气数据库及其更新数据库。

更新表将如下所示:

CREATE TABLE `updates` (
    `weatherStationId` INT NOT NULL,
    `time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    `temperature` DECIMAL(10,7) NULL,
    `humidity` DECIMAL(10,7) NULL,
    CONSTRAINT `FK__weatherstations` FOREIGN KEY (`weatherStationId`) REFERENCES `weatherstations` (`id`)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB

例如,看起来像这样:

╔══════════════════╦═════════════════════╦═════════════╦══════════╗
║ weatherStationId ║        time         ║ temperature ║ humidity ║
╠══════════════════╬═════════════════════╬═════════════╬══════════╣
║               69 ║ 2015-03-06 00:04:56 ║           4 ║       29 ║
║             1337 ║ 2015-03-08 12:22:33 ║          29 ║       38 ║
╚══════════════════╩═════════════════════╩═════════════╩══════════╝

如果有更新,我想比较之前版本的新值(温度和湿度),例如:具有最新时间价值的记录,与我们获得更新的那个相同的天气。如果这些值不相同,或者没有针对该天气的存储更新,那么我只想插入具有新值的记录。否则,我想将最新记录的时间更改为现在()。

因此,在2015-03-07 12:00:00更新为weatherId 69,温度为4,湿度为30,上表将成为:

╔══════════════════╦═════════════════════╦═════════════╦══════════╗
║ weatherStationId ║        time         ║ temperature ║ humidity ║
╠══════════════════╬═════════════════════╬═════════════╬══════════╣
║               69 ║ 2015-03-06 00:04:56 ║           4 ║       29 ║
║             1337 ║ 2015-03-08 12:22:33 ║          29 ║       38 ║
║               69 ║ 2015-03-09 12:00:00 ║           4 ║       30 ║
╚══════════════════╩═════════════════════╩═════════════╩══════════╝

(值与其他值不同,因此插入新记录)

使用相同的更新,但湿度为29,表格现在应如下所示:

╔══════════════════╦═════════════════════╦═════════════╦══════════╗
║ weatherStationId ║        time         ║ temperature ║ humidity ║
╠══════════════════╬═════════════════════╬═════════════╬══════════╣
║               69 ║ 2015-03-09 12:00:00 ║           4 ║       29 ║
║             1337 ║ 2015-03-08 12:22:33 ║          29 ║       38 ║
╚══════════════════╩═════════════════════╩═════════════╩══════════╝

(新值与之前相同,因此只将旧记录中的时间更新为新记录的时间。或者,如果愿意,请插入新记录并删除旧记录)

目前我在PHP中这样做是很容易的。截至目前,我对此方法没有任何实际问题。我只是觉得可能有一种方法可以用一个sql语句来完成所有操作,我怀疑这意味着代码越来越简洁,以及更好的性能,因为我认为可能成为一个小问题数据库在增长。

我发现以下问题和答案涉及类似问题MySQL: Do not insert a new row if defined rows are same

问题在于,在我的情况下,我为成千上万的" weatherstations"立刻。我无法使用多插入工具获得该解决方案。 有办法吗?

2 个答案:

答案 0 :(得分:0)

在包含BEFORE UPDATE读数的新表格上设置Current TRIGGER。将INSERT更改为UPDATE Current。触发器将被编码以发现是否有任何更改,并且只有在它发生的情况下,它才会继续插入到您描述的表中。

答案 1 :(得分:0)

要使多行INSERT工作,您需要以某种方式收集数据,然后批量插入它们。

计划A:以某种方式将它们收集在非mysql代码中。如果这是可能的,这是更好的方法。

计划B:有一个“临时表”,可能是没有任何索引的MyISAM。将您的读数插入其中。然后,在阅读时间之间,执行INSERT INTO Real SELECT * FROM StagingTRUNCATE TABLE staging