使用一个 SQL 查询更新所有行
Update all rows with one SQL query
我正在使用这个 PostgreSQL table 来存储配置变量:
CREATE TABLE SYS_PARAM(
SETTING_KEY TEXT NOT NULL,
VALUE_TYPE TEXT,
VALUE TEXT
)
;
如何使用一个 SQL 语句更新所有配置设置值?
我想你可以通过相关更新来实现。
请参考以下帖子:
https://www.ibm.com/support/knowledgecenter/ssw_i5_54/sqlp/rbafyexsub4.htm
如果您计划随着时间的推移多次执行这些更新,最好有一个函数为您处理。您可以使用 table 本身作为函数内可变参数的类型,如下所示:
-- 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);
更新使用案例
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.
您可以在最后使用 where true
,它会更新 table 中的所有行。
例如:
UPDATE table_name set table_column = value where true;
它将在一个 SQL 查询中更新所有行。
您可以加入值列表并更新:
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
是 table 的主键。
我正在使用这个 PostgreSQL table 来存储配置变量:
CREATE TABLE SYS_PARAM(
SETTING_KEY TEXT NOT NULL,
VALUE_TYPE TEXT,
VALUE TEXT
)
;
如何使用一个 SQL 语句更新所有配置设置值?
我想你可以通过相关更新来实现。
请参考以下帖子:
https://www.ibm.com/support/knowledgecenter/ssw_i5_54/sqlp/rbafyexsub4.htm
如果您计划随着时间的推移多次执行这些更新,最好有一个函数为您处理。您可以使用 table 本身作为函数内可变参数的类型,如下所示:
-- 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);
更新使用案例
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.
您可以在最后使用 where true
,它会更新 table 中的所有行。
例如:
UPDATE table_name set table_column = value where true;
它将在一个 SQL 查询中更新所有行。
您可以加入值列表并更新:
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
是 table 的主键。