代码之家  ›  专栏  ›  技术社区  ›  dot

尝试将记录插入postgresql数据库时出现“无效组合field1 field2 field3”错误消息

  •  0
  • dot  · 技术社区  · 10 年前

    我正在尝试将数据库从服务器a还原到服务器B。由于某种原因,在3个特定的INSERT语句上导入失败:

    INSERT INTO tbl1 (device_id, group_name, param_id, value) VALUES (15, 'regX', 13, '4323');
    INSERT INTO tbl1 (device_id, group_name, param_id, value) VALUES (15, 'device', 1, 'aatd');
    INSERT INTO tbl1 (device_id, group_name, param_id, value) VALUES (15, 'regX', 14, 'ttdf');
    

    返回的错误为:

    错误:设备、组和参数的组合无效

    每个记录都有相同的错误。

    表定义如下:

    testdb=# \d+ tbl1; 
                               Table "public.tbl1"
       Column   |          Type          | Modifiers | Storage  | Stats target | Description 
    ------------+------------------------+-----------+----------+--------------+-------------
     device_id  | integer                |           | plain    |              | 
     group_name | character varying(255) |           | extended |              | 
     param_id   | integer                |           | plain    |              | 
     value      | character varying(255) |           | extended |              | 
    

    其他看起来类似的记录也能正常工作,没有问题。例如:

    INSERT INTO tbl1 (device_id, group_name, param_id, value) VALUES (103, 'regX', 13, '130'); 
    

    事实上,数据库/导入文件有900多条记录,这是唯一失败的3条记录。

    如何创建转储文件/如何导入转储:

    要导出:

    pg_dump --create -U postgres origdb > outputfile.sql
    

    然后在新服务器上,导入:

    psql -f outputfile.sql -U postgres
    

    迄今为止我所做的努力:

    1. 我已经确认,在原始数据库中,这些记录存在,并且与转储命令生成的记录相匹配。 以下是原始数据库中的数据:
    origdb=# select * from tbl1 where device_id = 15;
    
     device_id | group_name | param_id |    value     
    -----------+------------+----------+--------------
            15 | regX       |       13 | 4323
            15 | device     |        1 | aatd
            15 | regX       |       14 | ttdf
    (3 rows)
    
    1. 我尝试在新服务器上手动导入这些记录,而不是导入整个转储文件。我收到了同样的错误消息。

    2. 我也一直在检查,看看定义了什么pk。。。

    testdb=#选择
    pg_attribute.attname, 格式类型(pg_attribute.atttypid,pg_attrit.atttypmod) 来自pg_index、pg_class、pg_attribute、pg_namespace 哪里 pg_class.oid=“tbl1”::regclass AND indrelid=pg_class.oid与 nspname='public'与 pg_class.relnamespace=pg_namespace.oid与 pg_attribute.attrelid=pg_class.oid与 pg_attribute.attnum=任何(pg_index.indkey) 和不适;

     attname | format_type 
    ---------+-------------
    (0 rows)
    

    问题:

    1. 我不太确定它在错误消息中的名称“设备、组和参数”在哪里。。。这些对应什么?我假设字段名,但如何验证?

    2. 还有什么建议可以检查以排除故障吗?我只是四处寻找这张桌子上的外国钥匙等。??但任何建议都将不胜感激。 我没有建立这个数据库,所以我不确定所有的关系等等。

    谢谢

    1 回复  |  直到 6 年前
        1
  •  0
  •   Teixi    10 年前

    这看起来像一个触发器,它阻止这些特定的插入并显示自定义消息。 触发器可以在原始数据库中禁用,但不能在新数据库中禁用。 使用以下命令查看用户创建的触发器:

    SELECT * FROM pg_trigger;