PostgreSql - 在数据库迁移期间转换为cidr

时间:2017-10-20 13:01:07

标签: postgresql varchar postgresql-9.6 cidr pgadmin-4

我是法国人。所以,对不起我的错误!

我正在通过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,但它不起作用!同样的恐怖! 我到处搜索知道如何将这个f ***** g CHARACTER VARYING转换为CIDR类型,但没有结果!请 !!!帮我 ! :(

1 个答案:

答案 0 :(得分: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'