我需要将大约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);
答案 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);
\copy
是psql
程序的命令,负责加载文件客户端并将其提供给服务器。
如果上下文不允许使用psql
命令,则可以使用SQL语句COPY tablename FROM '/path/to/file.txt'
,但必须以超级用户身份连接,并且{{}服务器上的文件应该可以访问{ {1}}用户。
如果无法接受这些限制,您可以使用postgres
并以自己的方式提供数据。