希望在一个声明

时间:2016-06-18 14:51:16

标签: 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记录。

2 个答案:

答案 0 :(得分:1)

您的问题似乎在混淆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功能进行尝试插入,如果不是更新。

答案 1 :(得分:0)

插入没有where where

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

更新你应该使用

Update HOSTS
SET display_name = concat('local_host' , spli_part(address, '.',4));
 where address  in ('192.168.0.1','192.168.0.2', .....)