我想在一条语句中更新PostgreSQL和Go中的多行。有没有办法做如下事情?
UPDATE table
SET column_a = "FINISH",
column_b = 1234
WHERE id = '1',
column_a = "UNFINISH",
column_b = 3124
WHERE id = '2'
还有有没有一个例子,如果用go语言执行?
我很喜欢使用派生表来构建它:
UPDATE t
SET column_a = v.column_a,
column_b = v.column_b
FROM (VALUES (1, 'FINISH', 1234),
(2, 'UNFINISH', 3124)
) v(id, column_a, column_b)
WHERE v.id = t.id;
这使得添加额外的值(包括< code>id和列)变得简单,而不会使查询变得复杂。它也不容易出现意外错误。
我想你想要:
update mytable
set
column_a = case when id = 1 then 'FINISH' else 'UNFINISHED' end,
column_b = case when id = 1 then 1234 else 3124 end
where id in (1, 2)
理由:
>
where
子句仅对要更新
的 id
进行筛选,这样效率更高(前提是您在 id
上有索引),并简化了条件逻辑
id
看起来像一个数字,所以应该这样对待(即,不要用引号包围文字值)
文字字符串必须用单引号包围-双引号代表标识符(例如列名)
在Postgres中执行此操作的最有效方法是使用UNNEST
。这允许您每列传递一个参数(而不是行数x列数)。对于您的示例,如下所示:
UPDATE table
SET
column_a=bulk_query.updated_column_a,
column_b=bulk_query.updated_column_b
FROM
(
SELECT * FROM UNNEST(
?::TEXT[],
?::TEXT[],
?::INT[]
) AS t(id, updated_column_a, updated_column_b)
) AS bulk_query
WHERE
users.id=bulk_query.id
然后可以传递三个参数:
[
["1", "2"],
["FINISH", "UNFINISH"],
[1234, 3124]
]
这种方法的优点是,无论要更新多少行,您都只需要这3个参数。
我在这篇博文中写了更多关于这个主题的内容:https://www.atdatabases.org/blog/2022/01/21/optimizing-postgres-using-unnest#update-multiple-records-to-different-values-in-a-single-query
我希望在一条语句中更新PostgreSQL中的多行。有没有一种方法可以做到以下几点?
问题内容: 我在这里找到了一些可以更新一个字段的东西:http : //www.karlrixon.co.uk/articles/sql/update-multiple-rows-with-different- values-and-a-single-sql- query/ 我的问题是如何更新多个字段?如: 这当然是行不通的。尝试了其他几种组合并失败了。任何的想法?谢谢! 问题答案:
问题内容: 有什么方法可以简化为一个查询吗? 问题答案: 是的,您可以使用以下查询进行操作:
问题内容: 我有2张桌子,如下所示: serial_table serial_key CHARACTER VARYING(20), PRIMARY KEY(id, serial_key) serial_rate: serial_key CHARACTER VARYING(20), rate NUMERIC, PRIMARY KEY(id, serial_key), FOREIGN KEY (id,
问题内容: 我正在尝试通过将新记录更新或插入新的记录到 voice_user_table中 来更新数据库。该表定义如下: 这是我正在使用的查询。我实际上对所有值都使用了参数,但是出于测试目的,我将其替换为我确定应该可以使用的值。用户名 aaa@aaa.com 存在。 运行查询后,我得到的输出是: 尽管应该插入新值,但是因为该行在数据库上尚不存在。当我仅使用insert子句手动插入一行,然后执行上面
我尝试通过实现以下函数,使用单个查询更新多行(约 350000): 尝试运行上述函数时,仅更新了 31 条记录。然后,我尝试使用以下函数逐行更新: 后者迄今已更新了所有记录,但速度很慢(估计将在9小时内结束)。有人知道更新多个记录的有效方法吗?