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

时间:2014-07-21 19:38:33

标签: sql import insert postgresql-9.2 database-restore

我试图将数据库从服务器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. 我已经确认在原始数据库中存在这些记录,并且与dump命令生成的记录相匹配。 这是原始数据库中的数据:
  2. 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. 我也一直在查看已定义的内容...

    3.   

      testdb =#SELECT
              pg_attribute.attname,         format_type(pg_attribute.atttypid,pg_attribute.atttypmod)       FROM pg_index,pg_class,pg_attribute,pg_namespace       哪里         pg_class.oid =' tbl1' :: regclass AND         indrelid = pg_class.oid AND         nspname =' public'和         pg_class.relnamespace = pg_namespace.oid AND         pg_attribute.attrelid = pg_class.oid AND         pg_attribute.attnum = any(pg_index.indkey)        和indisprimary;

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

      问题:

      1. 我不太确定它在哪里获取名称"设备,组和参数"在错误消息中......这些对应于什么?我假设字段名称,但我该如何验证呢?

      2. 有关要检查哪些问题以解决问题的任何建议?我只是四处寻找这张桌子上的任何外键等等。但任何建议将不胜感激。 我没有建立这个数据库,所以我不确定所有的关系等。

      3. 感谢。

1 个答案:

答案 0 :(得分:0)

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

SELECT * FROM pg_trigger;