如何更新PostgreSQL中多行的某些列
我有一个名为Configuration的表。表的第一列是deviceId,第二列是parameter,第三列是value 表中有许多设备,每个设备只有一个设备ID(第1列);每个设备都有许多配置参数(第2列),例如版本、日期、公司等,所有设备都有相同的配置参数;不同设备的参数值(第3列)可能相同,也可能不同 我想用ID等于“id12345”的设备的新参数值(第3列)更新两个配置参数,如VER和DATE如何更新PostgreSQL中多行的某些列,postgresql,Postgresql,我有一个名为Configuration的表。表的第一列是deviceId,第二列是parameter,第三列是value 表中有许多设备,每个设备只有一个设备ID(第1列);每个设备都有许多配置参数(第2列),例如版本、日期、公司等,所有设备都有相同的配置参数;不同设备的参数值(第3列)可能相同,也可能不同 我想用ID等于“id12345”的设备的新参数值(第3列)更新两个配置参数,如VER和DATE 如何在一个PostgreSQL查询中实现这一点?这是您可以做到的,尽管我认为这不是一个好主意
如何在一个PostgreSQL查询中实现这一点?这是您可以做到的,尽管我认为这不是一个好主意
UPDATE configuration
SET value =
CASE parameter
WHEN 'VER' THEN new_ver_value
WHEN 'DATE' THEN new_date_value
END
WHERE deviceid = 'id12345';
像这样的参数表通常被认为是一个坏主意,因为这个查询的复杂性有助于说明这一点。此外,由于您说所有设备都有相同的参数,因此这样做而不是为每个参数指定唯一的列似乎没有任何用处
如果可能的话,也可以使用deviceid的数字,而不是字符串
根据要求,要更新其他字段(如设置为当前_时间的时间字段),可以执行以下操作
UPDATE configuration
SET value =
CASE parameter
WHEN 'VER' THEN new_ver_value
WHEN 'DATE' THEN new_date_value
END,
time = current_time
WHERE deviceid = 'id12345'
AND parameter IN ('VER', 'DATE');
对于第一个查询,下面是一个显示结果的测试
CREATE TABLE configuration
(deviceid CHARACTER VARYING (20),
parameter CHARACTER VARYING (10),
VALUE integer);
INSERT INTO configuration
(VALUES ('id12345', 'VER', 1),
('id12345', 'DATE', 20190101),
('id12345', 'COMPANY', 55),
('id33333', 'VER', 2),
('id33333', 'DATE', 20180101),
('id33333', 'COMPANY', 6));
SELECT * FROM configuration;
id12345 VER 1
id1234 DATE 20190101
id12345 COMPANY 55
id33333 VER 2
id33333 DATE 20180101
id33333 COMPANY 6
UPDATE configuration
SET value =
CASE parameter
WHEN 'VER' THEN 11
WHEN 'DATE' THEN 2020010
END
WHERE deviceid = 'id12345'
AND parameter IN ('VER', 'DATE');
SELECT * FROM configuration;
id12345 COMPANY 55
id33333 VER 2
id33333 DATE 20180101
id33333 COMPANY 6
id12345 VER 11
id12345 DATE 2020010
谢谢如果我有第4列“time”想要用列“value”更新,我该怎么做呢?在参数表中,您只需将它添加到
END
之后,用逗号分隔,类似于time=current\u time
(或current\u timestamp
),如果您只想在修改VER
或DATE
时设置它,那么您应该在WHERE
子句中添加和('VER',DATE')
中的参数。。如果您的表有单独的列,那么实际上每行只能保留一列。谢谢。当使用第一个代码更新参数时,所有设备都会得到更新,但不仅仅是设备“id12345”。。。。您能帮忙吗?第一个查询有问题,但您描述的查询没有问题。它需要在WHERE
中添加一个附加子句,以防止它修改公司
。但是,它只修改id='id12345'
所在的行,正如我添加到答案中的测试所示。谢谢。我通过Heidi运行查询,我得到的日志是“/*受影响的行:75找到的行:0警告:1次查询的持续时间:0.000秒。(+0.047秒网络)*/”,它确实只更改了一行,但日志显示75行受影响。