使用一个SQL查询更新所有行

问题描述 投票:2回答:4

我正在使用这个PostgreSQL表来存储配置变量:

CREATE TABLE SYS_PARAM(
 SETTING_KEY TEXT NOT NULL,
 VALUE_TYPE TEXT,
 VALUE TEXT
)
;

enter image description here

如何使用一个SQL语句更新所有配置设置值?

sql postgresql sql-update postgresql-9.1 postgresql-9.3
4个回答
1
投票

如果您计划在一段时间内执行这些更新超过一次或两次,那么最好让一个函数为您处理此问题。您可以将表本身用作函数中可变参数的类型,如下所示:

-- The function
CREATE OR REPLACE FUNCTION update_sys_param(VARIADIC params sys_param[])
RETURNS VOID
AS $$
BEGIN

  UPDATE sys_param
    SET value_type = upd.value_type, value = upd.value
  FROM
    sys_param src
  INNER JOIN
    UNNEST(params) upd
    ON  (src.setting_key = upd.setting_key);

END; $$ LANGUAGE PLPGSQL;

-- To call it
SELECT update_sys_param(('SMTP_PORT','int','123'),('SMTP_OTHER','text','435343'));

但是,如果这是一次性更新,您可以尝试以下两种方法之一:

使用JOIN更新

UPDATE sys_param
   SET
     value_type = new.value_type,
     value = new.value
FROM
   sys_param src
INNER JOIN
   new_params new --< this table/view/cte must already exist or you must create it.
   ON  (src.setting_key = new.setting_key);

使用CASE更新

UPDATE sys_param
SET value = CASE setting_key
      WHEN 'SMTP_PORT' THEN '2100'
      (..and so on..)
      END;
-- You would need to repeat the case statement if you intend on updating the value_type, too.

1
投票

我想你可以通过相关更新实现这一目标。

请参考以下帖子:

https://www.ibm.com/support/knowledgecenter/ssw_i5_54/sqlp/rbafyexsub4.htm


0
投票

您可以在最后使用where true并更新表中的所有行。例如:

UPDATE table_name set table_column = value where true;

它将更新一个SQL查询中的所有行。


0
投票

您可以加入值列表并使用以下更新:

update sys_param
   set value = v.new_value
from (
  values 
     ('SMTP_PORT', '123'), 
     ('SMTP_SERVER', 'new_server'),
     ('SMTP_USERNAME', 'Arthur')
) as v(skey, new_value)
where v.skey = sys_param.setting_key;

这假设setting_key是该表的主键。

© www.soinside.com 2019 - 2024. All rights reserved.