sql - 希望在一份声明中更新现有记录

标签 sql postgresql

我试图在单个查询中更新主机列表。

有点像......

INSERT INTO
  hosts ('address', 'display_name') 
VALUES ([['192.168.0.1', 'localhost', '...more'], ['192.168.0.2', 'localhost2', '...more']]);
WHERE host.address = ['192.168.0.1','192.168.0.2', ... ]

但我真的不确定该怎么做?

我想一次强制更新 10k 条记录。

最佳答案

您的问题似乎混淆了 INSERTUPDATE。如果您想INSERT,这很容易。它只是一个逗号分隔的元组列表:

INSERT INTO hosts ('address', 'display_name') VALUES
('192.168.0.1', 'localhost1'),
-- etc.
('192.168.0.2', 'localhost2')
;

对于 UPDATE,假设您可以将 address 视为主键,您可以传递相同的大值列表并加入它,如下所示:

UPDATE hosts
SET display_name = x.n
FROM (VALUES
  ('192.168.0.1', 'localhost1'),
  -- etc.
  ('192.168.0.2', 'localhost2')
) x(ip, n)
WHERE hosts.address = x.ip
;

如果您运行的是 Postgres 9.5,您还可以使用新的 ON CONFLICT 功能来执行 try-to-insert-and-if-not-then-update。

关于sql - 希望在一份声明中更新现有记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37898264/

相关文章:

perl - 为 SQL 查询的结果分配一个标量

java - jooq 生成的针对 postgres 的查询的性能问题

mysql - 带有连接的相对简单的 SQL 查询拒绝高效

linux - bash变量似乎无法分配给在容器中执行的psql输出

postgresql - Siddhi 中触发器的运行时间

postgresql - PostgreSQL 的事务超时解决方法

mysql - 值范围内记录的计数和百分比

php - sql在表中显示数据而不指定列名

java - 使用 ID 而不是 DATE 列有什么缺点吗?

sql - 使用分组依据查找数组中最常见的元素