postgres和IPv6地址的大清单

时间:2013-08-28 00:23:40

标签: postgresql

我需要将大约6000个IPv6地址加载到postgres表中。甚至没有找到我的“如果不存在的错误”的点,它就在未转义的':'上b b 我不太了解postgres,是否有一个LOAD DATA INFILE函数会读取行并忽略':'以及查找现有记录?

INSERT INTO ip_list (ip_addr)
SELECT 'ip_addr',
 2600:3c01:e000:44:0:0:0:1,
 2600:3c01:e000:44:0:0:0:2,
 2600:3c01:e000:44:0:0:0:3,
 2600:3c01:e000:44:0:0:0:4,
 2600:3c01:e000:44:0:0:0:5,
 2600:3c01:e000:44:0:0:0:7,
....
WHERE NOT EXIST(
        SELECT 1 FROM ip_list WHERE name = 'ip_addr')
        RETURNING id
        );


ERROR:  syntax error at or near ":"
LINE 3:  2600:3c01:e000:44:0:0:0:1,

更新

此方法永远不会上传任何记录:

You are now connected to database "postfix" as user "postgres".
postfix=# create temporary table t(ip_addr inet);
CREATE TABLE
postfix=# \copy t from '/var/www/localhost/htdocs/ipListScript'
postfix=# INSERT INTO ip_list(ip_addr)
select ip_addr from ip_list where
not exists (select 1 from ip_list where ip_list.ip_addr=ip_list.ip_addr);

2 个答案:

答案 0 :(得分:2)

看起来您只需要在IP地址周围加上引号。查看此页面以获取更多信息:

http://www.postgresql.org/docs/9.1/static/datatype-net-types.html

答案 1 :(得分:1)

6000个地址作为SQL语句中的常量是不合理的,除了你提出的语法无论如何都是错误的(需要VALUES子句)。

合理的方法是将COPY放入文件的临时表中,然后从临时表插入到最终表中,同时消除重复。

在psql中:

create temporary table t(ip_addr inet);

\copy t from '/path/to/file.txt'

INSERT INTO ip_list(ip_addr) 
 select ip_addr from t where
   not exists (select 1 from ip_list where ip_list.ip_addr=t.ip_addr);

\copypsql程序的命令,负责加载文件客户端并将其提供给服务器。

如果上下文不允许使用psql命令,则可以使用SQL语句COPY tablename FROM '/path/to/file.txt',但必须以超级用户身份连接,并且{{}服务器上的文件应该可以访问{ {1}}用户。
如果无法接受这些限制,您可以使用postgres并以自己的方式提供数据。