创建约束触发器的错误

时间:2016-08-17 15:00:17

标签: postgresql pg-dump

首先让我说我是Linux / Unix管理员。据说我的经理让我将旧的PostgreSQL数据库移到运行8.4.20的RedHat服务器上。我成功移动了7.2.1分贝,但我遇到了移动7.4.20分贝的问题。

我使用query.Run <@ query.Select(query.For(query.Source db.Customers, fun c -> query.Yield c), fun c -> c.CustomerID, query.Run <@ query.Select(query.For(query.Source c.Orders, fun o -> query.Yield o), fun o -> o.OrderID) @> |> Seq.toList) @> pg_dump –c filename。对于有问题的db,一切都会运行,直到我得到psql < filename语句。如果我按原样运行它,我会得到:

  

注意:忽略约束的不完整触发器组“”FOREIGN KEY数据(ups)REFERENCES upsinfo(ups)   DETAIL:找到引用表的DELETE触发器。   创建触发器

如果我运行CREATE CONSTRAINT TRIGGER,我会:

  

错误:关系“upsinfo”不存在

所涉及的表格(我认为)是:

set schema 'pg_catalog';

触发器问题触发器声明:

CREATE TABLE upsinfo (
    ups text NOT NULL,
    ipaddr inet,
    rcomm text,
    wcomm text,
    reachable boolean,
    managed boolean,
    comments text,
    region text
);

CREATE TABLE data (
    date timestamp with time zone,
    ups text,
    mib text,
    value text
);

我知道CREATE CONSTRAINT TRIGGER "<unnamed>" AFTER DELETE ON upsinfo FROM data NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE "RI_FKey_cascade_del"('<unnamed>', 'data', 'upsinfo', 'UNSPECIFIED', 'ups', 'ups'); 函数在不同版本的pg_catalog中的定义不同。请注意,search_path设置为'public,pg_catalog',所以我也很困惑,为什么我必须设置架构。

再次,我不是一个真正的PostgreSQL DBA,所以尽量善待。

2 个答案:

答案 0 :(得分:0)

Oof,这些真正旧的postgres版本,包括您升级到的版本(8.4在2009年发布,支持在2014年结束)。

简短的回答就是,只要upsinfodata被创建和填充,您就可以了,并且很高兴。但是你的一个外键关系破裂了。

答案很长,好吧,让我看看我是否可以解释发生了什么(或者至少,我认为发生了什么)。

我猜测data的原始表定义包含FOREIGN KEY (ups) REFERENCES upsinfo (ups) ON DELETE CASCADE之类的内容。这会导致postgres自动产生一些触发约束:1-每当data有一个新行时,请确保其ups列与upsinfo中的现有行匹配,并且每个从upsinfo删除行的时间,根据匹配的data值删除ups中的相应行。

当外键关系不起作用时,可能会出现(信息量不大)错误消息。为了使外键有意义,引用的值必须是唯一的 - upsinfo中每个不同的值ups应该只有一行。为了让postgres 知道upsinfo.ups上需要有唯一的索引或主键。

在这种情况下,其中一件事可能会破坏它:

  1. upsinfo.ups上没有主键或唯一索引(postgres不应该允许外键,但可能有非常旧的版本)
  2. 曾经有一个独特的索引,但它没有正确强制执行唯一性,所以它没有成功导入(一个错误,也可能来自一个非常旧的版本)
  3. 在任何一种情况下,如果该外键关系很重要,您可以尝试在导入完成后修复它。首先尝试在upsinfo.ups上创建一个唯一索引,然后查看是否有问题。如果您这样做,请解决重复的条目,然后再试一次,直到它工作。然后发出类似:

    的内容
    ALTER TABLE data
      ADD FOREIGN KEY (ups) REFERENCES upsinfo (ups) ON DELETE CASCADE;
    

    当然,如果事情正常,你可能不需要修复外键,在这种情况下你可能会忽略这些错误并继续前进。

    希望有所帮助,祝你好运!

答案 1 :(得分:0)

这似乎是ON DELETE CONSTRAINT的一部分。如果我是你,我会删除所有这些语句,并在目标表上用适当的约束定义替换它们。

表定义应如下所示:

CREATE TABLE bookings (
    boo_id serial NOT NULL,
    boo_hotelid character varying NOT NULL,
    boo_roomid integer NOT NULL,
    CONSTRAINT pk_bookings
        PRIMARY KEY (boo_id),
    CONSTRAINT fk_bookings_boo_roomid 
        FOREIGN KEY (boo_roomid)
        REFERENCES rooms (roo_id) MATCH SIMPLE
        ON UPDATE CASCADE ON DELETE CASCADE
) WITHOUT OIDS;

这部分将在内部创建触发器:

    CONSTRAINT fk_bookings_boo_roomid 
        FOREIGN KEY (boo_roomid)
        REFERENCES rooms (roo_id) MATCH SIMPLE
        ON UPDATE CASCADE ON DELETE CASCADE

但是,说实话,我对升级到不支持的版本没有任何理解。你知道Postgres现在是9.5版,对吧?