Vis*_*mar 7 postgresql foreign-key partitioning
我有一个安装了 PostgreSQL 9.1 的 Ubuntu 12.04 服务器。
我正在尝试在现有的 Postgres DB(比如“xyz”)上设置分区,它有非常大的表,有些表上设置了外键。
这就是我到目前为止所做的
pg_dump
从DB“XYZ”的所有表的独立。为每个转储启用了--column-inserts
。但是在做最后一步时,我收到了一个错误,比如
ERROR: insert or update on table "aaaaa" violates foreign key constraint "bbbbb_id_refs_id_5b63fd27"
DETAIL: Key (bbbbb_id)=(6817) is not present in table "bbbbb".
结果,基于外键的表没有导入。
如果我在 bbbbb 上对 id 6817 执行 Select 查询,记录确实会显示出来。
然后在谷歌搜索之后我发现了这个,http://www.postgresql.org/docs/9.1/static/ddl-inherit.html
根据维基中提到的警告,继承不适用于外键。
(这对我来说是一个非常坏的消息 :( 我花了很多时间来创建触发器。)
现在,我想知道是否有一种解决方法可以使用外键管理 Postgres 上的分区?
或者
有没有其他方法可以处理带有外键的大表?
Chr*_*ers 11
首先,我建议阅读:http : //ledgersmbdev.blogspot.com/2012/08/postgresql-or-modelling-part-3-table.html因为虽然它不包括分区,但您正在使用表进行分区继承,这将涵盖很多细节。
一般来说,您可以通过三种方式处理此问题。第一种是使用专门的键表(用触发器管理)并在 fkey 约束中引用这些表。这通常是最简单的方法,但在某些情况下成本很高。
第二种可能性是您可以通过外键对连接表进行分区。这可能会导致严重的复杂性问题,因此除了极少数情况外,这是我最不喜欢的方法。
最后一种可能性是您可以编写自己的约束触发器来管理外键实施。
您选择哪种方法将取决于连接信息的复杂性,尤其是传递连接信息。第二种方法允许您以显着(可能是主要的)复杂性成本完全声明式地做事情,而第一种和第三种方法远离声明式方法,这意味着您可能还想使用 pgTAP 在触发器上运行测试用例...... .
这些解决方案都不是没有显着的复杂性。您可能需要重新考虑分区是否是最好的方法,以及部分索引和其他方法是否能让您到达需要的地方。
归档时间: |
|
查看次数: |
7541 次 |
最近记录: |