首先让我说我是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,所以尽量善待。
答案 0 :(得分:0)
Oof,这些真正旧的postgres版本,包括您升级到的版本(8.4在2009年发布,支持在2014年结束)。
简短的回答就是,只要upsinfo
和data
被创建和填充,您就可以了,并且很高兴。但是你的一个外键关系破裂了。
答案很长,好吧,让我看看我是否可以解释发生了什么(或者至少,我认为发生了什么)。
我猜测data
的原始表定义包含FOREIGN KEY (ups) REFERENCES upsinfo (ups) ON DELETE CASCADE
之类的内容。这会导致postgres自动产生一些触发约束:1-每当data
有一个新行时,请确保其ups
列与upsinfo
中的现有行匹配,并且每个从upsinfo
删除行的时间,根据匹配的data
值删除ups
中的相应行。
当外键关系不起作用时,可能会出现(信息量不大)错误消息。为了使外键有意义,引用的值必须是唯一的 - upsinfo
中每个不同的值ups
应该只有一行。为了让postgres 知道,upsinfo.ups
上需要有唯一的索引或主键。
在这种情况下,其中一件事可能会破坏它:
upsinfo.ups
上没有主键或唯一索引(postgres不应该允许外键,但可能有非常旧的版本)在任何一种情况下,如果该外键关系很重要,您可以尝试在导入完成后修复它。首先尝试在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版,对吧?