我无法透露我存储的实际数据类型,但想象一下,我有一个天气数据库及其更新数据库。
更新表将如下所示:
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"立刻。我无法使用多插入工具获得该解决方案。 有办法吗?
答案 0 :(得分:0)
在包含BEFORE UPDATE
读数的新表格上设置Current
TRIGGER。将INSERT更改为UPDATE Current
。触发器将被编码以发现是否有任何更改,并且只有在它发生的情况下,它才会继续插入到您描述的表中。
答案 1 :(得分:0)
要使多行INSERT工作,您需要以某种方式收集数据,然后批量插入它们。
计划A:以某种方式将它们收集在非mysql代码中。如果这是可能的,这是更好的方法。
计划B:有一个“临时表”,可能是没有任何索引的MyISAM。将您的读数插入其中。然后,在阅读时间之间,执行INSERT INTO Real SELECT * FROM Staging
和TRUNCATE TABLE staging
。