我无法透露我正在存储的实际数据类型,但假设我有一个气象站及其更新的数据库。
更新表将类似于以下内容:
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 ║
╚══════════════════╩═════════════════════╩═════════════╩══════════╝
当有更新时,我想比较以前的值的新值(温度和湿度),例如在与我们更新的相同 weatherstationId 的记录中具有最新时间值的记录。如果这些值不相同,或者该气象站没有存储更新,那么我只想插入具有新值的记录。否则我想将最新记录的时间更改为 now()。
因此,在 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 ║
╚══════════════════╩═════════════════════╩═════════════╩══════════╝
(值与 rest 不同,因此插入新记录)
除了湿度为 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
问题是,在我的例子中,我同时插入了数万个“气象站”的更新。而且我无法使该解决方案与多插入一起使用。 有办法吗?
最佳答案
在包含当前
读数的新表上设置BEFORE UPDATE
触发器。将 INSERT 更改为 UPDATE Current
。触发器将被编码以发现是否有任何更改,并且仅当发生更改时,它才会继续将 INSERT 插入到您描述的表中。
关于mysql - 仅当值与多插入的前一条记录不同时才插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28898733/