1

我想强制一个表中的一行必须在另一个表中具有匹配的行,反之亦然。我目前正在这样做以解决您无法引用尚未创建的表的事实。有没有更自然的方式我不知道?

CREATE TABLE LE (id int PRIMARY KEY);
CREATE TABLE LE_TYP (id int PRIMARY KEY, typ text);

ALTER TABLE LE ADD CONSTRAINT
  twowayref FOREIGN KEY (id) REFERENCES LE_TYP (id) DEFERRABLE INITIALLY DEFERRED;

ALTER TABLE LE_TYP ADD CONSTRAINT
  twowayref_rev FOREIGN KEY (id) REFERENCES LE (id) DEFERRABLE INITIALLY DEFERRED;
4

1 回答 1

0

你正在做的事情是你有循环约束的理想选择。在您的解决方案中没有什么可以改进的。

然而,有两点值得为下一位读者简要提及。首先,在您的代码中使用此解决方案并不清楚您选择顺序的原因。如果您这样做,您可能需要注意延迟哪个约束。通常这很明显,但您可能希望根据引用相应表的其他外键来选择插入顺序。

另一个是关于是否需要围绕循环依赖进行工程的想法。一方面,这样做似乎是一个明显的简化,这似乎是一个好主意。

然而值得指出的是,在这种情况下,您可能希望查看多表继承。这样,您可能会这样做:

CREATE TABLE p1 (
     id serial not null,
     attribute1 int not null,
     attribute2 text not null,
     check (attribute1 > 1 or length(attribute2) > 10)
);

CREATE TABLE p2 (
     id int not null, -- shared primary key with p1
     attribute3 int not null,
     attribute4 text not null
);

CREATE TABLE combined (
     primary key (id)
) INHERITS (p1, p2);

这会将您的所有列放在一个表中,但为您提供该表的逻辑接口,就好像它是连接在一个公共字段上的两个表一样。

于 2013-04-17T14:24:47.197 回答