我有 table :
CREATE TABLE `cold_water_volume_value` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`parameter_value_id` int(11) NOT NULL,
`time` timestamp(4) NOT NULL DEFAULT CURRENT_TIMESTAMP(4) ON UPDATE CURRENT_TIMESTAMP(4),
`value` double NOT NULL,
`device_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_cold_water_volume_value_id_device_time` (`parameter_value_id`,`device_id`,`time`),
KEY `idx_cold_water_volume_value_id_time` (`parameter_value_id`,`time`),
KEY `fk_cold_water_volume_value_device_id_idx` (`device_id`),
CONSTRAINT `fk_cold_water_volume_value_device_id` FOREIGN KEY (`device_id`) REFERENCES `device` (`id`) ON UPDATE SET NULL,
CONSTRAINT `fk_cold_water_volume_value_id` FOREIGN KEY (`parameter_value_id`) REFERENCES `cold_water_volume_parameter` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=684740 DEFAULT CHARSET=utf8;
所有行都有device_id = NULL
。我想通过脚本更新它:
UPDATE cold_water_volume_value SET device_id = 130101 WHERE parameter_value_id = 2120101;
但是,它不会将所选 parameter_value_id
的所有 device_id
从 null 替换为给定值,而是设置 time
和 value 的所有内容
列到 now ()
和一些(看起来与之前的值完全随机的)数字。
为什么会发生这种情况,以及如何正确地做到这一点?
最佳答案
时间
会根据您的架构自动更新。
`time` timestamp(4) NOT NULL DEFAULT CURRENT_TIMESTAMP(4) ON UPDATE CURRENT_TIMESTAMP(4)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
要解决这个问题,您可以在更新中将时间
设置为自身。
UPDATE cold_water_volume_value
SET device_id = 130101, time = time
WHERE parameter_value_id = 2120101;
但这可能会跟踪上次更新行的时间。如果是这样,它就按预期工作了,让它继续做它的事情。
至于value
,它可能有一个更新触发器。检查显示触发器
并查找该表上的触发器。
关于MySQL。为什么我不能只更新一列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57350321/