我有一个包含21,8,0,345,...
数字集的列,如果我想只对集合中的一个元素+1,例如元素3,我能用mysql查询吗?
我知道我可以使用php代码执行此操作(将字符串分解为数组然后更新它)但我担心在同一行同时进行多次更新时,值将被重写。
第一个查询将设置21,8,1,345
,第二个查询将使用21,9,0,345
替换有问题的元素可能也行不通,因为有些行包含多个具有相同值的元素,如2,40,40,41
答案 0 :(得分:0)
MySQL特别针对这种情况支持“SELECT ... FOR UPDATE”,以确保在处理行内容时不会覆盖该行。
https://dev.mysql.com/doc/refman/5.7/en/innodb-locking-reads.html
上面的链接甚至给出了一个非常相似的例子(除了爆炸元素,增加你想要的元素,并将它们重新组合在一起)。
SELECT counter_field FROM child_codes FOR UPDATE;
UPDATE child_codes SET counter_field = counter_field + 1;
正如蒂姆建议的那样,更好的答案是将这些数据存储在一个单独的表中,特别是因为每行有一个可变数量的项目。我不知道你现在如何知道你想要更新第三项,但我认为这已经知道了。
假设这些数字是来自“位置”的各种传感器的温度读数,它们逐渐上升和下降。您的主表是带有字段的“位置”:
id (int, auto-increment), location_name (varchar), ...
然后,您将创建一个名为“readings”的新表,其中包含字段:
id (int, auto-increment), location_id (int), temperature (smallint)
第一个表中的“id”将匹配“读数”中许多记录的“location_id”。
当您想要向某个位置添加新的温度读数时(我假设您在PHP中有$ location_id和$ new_reading变量):
INSERT INTO readings (location_id, temperature)
VALUES ( $location_id, $new_reading )
(注意:您应该使用PDO或其他库正确消毒您的输入,但这超出了这个答案的范围,或者我将在这里整晚。:-))
假设您要更新此位置的第3个读数,这意味着“偏移量”为2,您只想更新1个记录,这就是下面的“LIMIT 2,1”。 (我试过并且没有找到一种只在一个查询中执行此操作的方法; UPDATE似乎不支持偏移,至少在我的MySQL版本中没有。)
SELECT id FROM readings WHERE location_id = 1 ORDER BY id LIMIT 2, 1;
/* Let's say you stored the above result in $reading_id */
UPDATE readings SET temperature = temperature + 1 WHERE id = $reading_id;