关于更新问题的PostgreSQL约束



我目前正在研究SQL,我对必须为练习创建的约束有一个疑问。

给定2个表:

CREATE TABLE A (
a1 integer PRIMARY KEY,
a2 integer CHECK (a2>10))
CREATE TABLE B (
b1 integer PRIMARY KEY, b2 integer))

以及a和b

之间的许多关系表
CREATE TABLE R (
rID integer PRIMARY KEY,
a1ID integer REFERENCES A (a1),
b1ID integer REFERENCES B (b1))

我想在表B上创建一个约束,以便:添加B的新实例时,至少应该有5个,最多应与B。

相关的10个实例。

这就是我的做法:

1)插入B:

时触发触发器
CREATE triggerA BEFORE INSERT ON B 
EXECUTE PROCEDURE upCons();

2)创建一个函数,以检查与B相关的实例数:

这是我的问题,我可以通过执行此操作来计算R的实例数吗?

CREATE FUNCTION upCons() RETURN trigger AS $$
DECLARE x integer;
BEGIN
SELECT count(rID) INTO x FROM R;
IF (x<5 OR x>10) THEN RAISE EXCEPTION 'insert condition not met';
END IF;
END; LANGUAGE 'plpgsql';

或我通过计算关系中A的实例来做同样的事情。

这是解决问题的好方法吗?我应该做不同的事情吗?这是正确的,以

开始

我想在表B上创建一个约束,以便:当新实例时 添加B的b,至少应该有5个 a与b。

有关

此约束似乎是不合理的(或者甚至是不可能的),因为在将条目插入B(或A)时,就无法有任何已经引用新条目的关系。引用条目(与您一样,使用外键约束)要求条目本身已经存在于正确的表中。根据您的触发,如果您在R中没有足够的关系,则无法将任何内容插入B中。因此,您有效地使您的表B和R仅读取,因为您的触发器和表R拒绝了表B插入。插入外键约束,需要对表B的任何引用表B。

中已经存在
IF (x<5 AND x>10) THEN RAISE EXCEPTION 'insert condition not met';

这应该是或代替,对吗?

最新更新