gpt4 book ai didi

mysql - 仅当值与多插入的前一条记录不同时才插入?

转载 作者:行者123 更新时间:2023-11-30 22:48:23 25 4
gpt4 key购买 nike

我无法透露我正在存储的实际数据类型,但假设我有一个气象站及其更新的数据库。

更新表将类似于以下内容:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com