0

我使用PostgreSQL,但我在寻找答案的SQL标准越好。(PostgreSQL的)“高级”检查约束问题

我有以下表“文档” -

Column |   Type   | Modifiers    
------------+------------------------+-------------------- 
id   | character varying(32) | not null 
version | integer    | not null default 1 
link_id | character varying(32) | 
content | character varying(128) | 
Indexes: 
    "docs_pkey" PRIMARY KEY, btree (id, version) 

ID和link_id是有对方,所以link_id自我引用ID之间联动关系的文件。

问题自带的版本。现在,ID不再是主键(不会是唯一的要么),并且不能由link_id为外键引用 -

my_db=# ALTER TABLE docs ADD FOREIGN KEY(link_id) REFERENCES docs (id) ; 
ERROR: there is no unique constraint matching given keys for referenced table "docs" 

我试图寻找检查约束的东西,如“是否存在“但没有找到任何东西。

任何尖端将不胜感激。

回答

4

我经常这样做:

table document (id, common, columns, current_revision) 
table revision (id, doc_id, content, version) 

这意味着该文件有一个一对多的关系与它的修改,和一比一至当前的版本。

这样,您可以随时通过简单连接选择当前修订版的完整文档,并且文档表中只有一行可以链接父/子关系,但仍具有版本控制。

0

取决于它是否是你想要的,你可以简单地创建一个外键,包括版本字段。这是指向一个独特的行的唯一方式......

如果不工作,你可以写一个触发条件(表上的所有更新和插入),使检查。请注意,您还需要对文档表的触发器,制约该表将打破键(如关键数值本身删除或更新)的修改。

你不能用一个CHECK约束做到这一点,因为CHECK约束不能访问其它表的数据。

1

坚持尽可能靠近你的模型成为可能,您可以将表格一分为二,其中一个具有每“DOC” 1排和一个与每个“版本” 1行:

您有以下表“版本” -

Column |   Type   | Modifiers    
------------+------------------------+-------------------- 
id   | character varying(32) | not null 
version | integer    | not null default 1 
content | character varying(128) | 
Indexes: 
    "versions_pkey" PRIMARY KEY, btree (id, version) 

和下面的表中 “文档” -

Column |   Type   | Modifiers    
------------+------------------------+-------------------- 
id   | character varying(32) | not null 
link_id | character varying(32) | 
Indexes: 
    "docs_pkey" PRIMARY KEY, btree (id) 

现在

my_db=# ALTER TABLE docs ADD FOREIGN KEY(link_id) REFERENCES docs (id) ; 

是允许的,并且还希望:

my_db=# ALTER TABLE versions ADD FOREIGN KEY(id) REFERENCES docs; 

当然没有什么回采你得到一个“组合拳”来查看类似于您的原始表:

CREATE VIEW v_docs AS 
SELECT id, version, link_id, content from docs join versions using(id); 
+0

谢谢,我想接受你的答案只是发现SO每个问题只有一个接受答案的限制。由于我更倾向于jishi的答案(因为它更贴近我的应用程序设计),我所能做的就是投票。对不起。 – Jerry 2011-03-07 09:03:01

+0

@ jishi的回答很好 - 我很高兴你接受了它。您可能需要了解[推迟](http://www.postgresql.org/docs/8.4/static/sql-createtable.html#AEN58820)约束条件才能按照他的建议实施 – 2011-03-07 09:12:57