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

标签 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 ║
╚══════════════════╩═════════════════════╩═════════════╩══════════╝

当有更新时,我想比较以前的值的新值(温度和湿度),例如在与我们更新的相同 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/

相关文章:

mysql - SQL用户表设计问题

php - 如何在php中编写一个json文件作为数据源?

java - 在 Hibernate 中更新连接子类

mysql - MySQL 命令的奇怪行为 NOT IN | GROUP_CONCAT?

PHP 排名和更新所有数据库行

mysql - 获取按周和按月每天的平均小时数

sql - 如何从具有多个 SET 依赖项的 MSSQL 表中选择记录?

mysql - 修复因在文本编辑器中编辑 MySQL 数据库而损坏的序列化数据?

sql - 未生成 EF 6.1 索引 IsUnique

sql - 使用 group by 进行复杂 SQL 连接