2017-10-20 107 views
0

我是法国人。所以,对我的错误感到抱歉!PostgreSql - 在数据库迁移过程中投射到cidr

我正在通过pgAdmin4在PostgreSql 9.6上进行数据库迁移,第一个是CHARACTER VARYING类型字段,另一个是CIDR类型字段。 我使用这个命令:

INSERT INTO ip.cidr (cid_id, cid_res_id, cid_cidr) 
SELECT a, b, network(c) FROM dblink('host=xxx user=xxx password=xxx dbname=xxx', 'SELECT ipp_id, res_id, ipp_ipcidr FROM public.ipplage') 
AS x(a integer, b integer, c cidr) 

但它不工作! 这是错误:

ERREUR:无效CIDR值:«10.26.3.0/23» DETAIL:该值具有定位于掩模的右侧位。 **********错误********** ERREUR:无效的cidr值:«10.26.3.0/23» SQL状态:22P02 细节:该值的位置于面具的权利。

错误是法文的。我自己翻译它

我试图将varchar转换为cidr,但它不起作用!同样的错误! 我到处搜索,知道如何将这个字符变成CIDR类型,但没有结果!请 !!!帮我 ! 。:(

+0

Postgres中的“g”不是大写。 –

+0

哦,谢谢!但它不是真的我的问题:D –

+0

我知道,但必须解决之前开始阅读:P –

回答

1

这是因为10.26.3.0/23不是网络的地址10.26.2.0/23

所以,你有两个选择,这取决于你要保留的相关信息:

INSERT INTO ip.cidr (cid_id, cid_res_id, cid_cidr) 
SELECT a, b, network(c) FROM dblink('host=xxx user=xxx password=xxx dbname=xxx', 'SELECT ipp_id, res_id, ipp_ipcidr::inet::cidr FROM public.ipplage') 
AS x(a integer, b integer, c cidr) 

这投了网络地址INET,然后找到INET的网络地址

或者,如果你想保持你的地址:

INSERT INTO ip.cidr (cid_id, cid_res_id, cid_cidr) 
SELECT a, b, network(c) FROM dblink('host=xxx user=xxx password=xxx dbname=xxx', 'SELECT ipp_id, res_id, ipp_ipcidr FROM public.ipplage') 
AS x(a integer, b integer, c inet) 

如果您想了解更多的相关信息:https://www.postgresql.org/docs/9.6/static/datatype-net-types.html

编辑:顺便说一下,如果你希望你的错误用简单的英语,而不是在法国(我是法国人,并遇到了同样的问题;-)您可以注释掉这行postgresql.conf

default_text_search_config = 'pg_catalog.french' 
+0

有趣。我强硬的问题是IP地址,但当测试它是自动更正,并没有抛出任何错误。 http://rextester.com/QXFG14627 –