我目前正在学习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个且最多有10个a实例与B相关。
我就是这样做的:
1)插入B时触发:
CREATE triggerA BEFORE INSERT ON B
EXECUTE PROCEDURE upCons();

2)创建一个检查与B相关的a实例数的函数:
这是我的问题,我可以通过这样做来计算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时,应至少有5个且最多有10个
A与B有关。
这个约束似乎不合理(甚至可能是不可能的),因为在向B(或A)中插入条目时,不能有任何关系已经引用了新条目。引用一个条目(使用外键约束,就像您所做的那样)需要输入本身已经存在于正确的表中。根据您的触发器,如果在R中没有足够的关系,则不能将任何东西插入到B中。因此,实际上已经使表B和R只读,因为表B的插入被触发器和表R插入所拒绝,而外键约束需要引用表B中已经存在的表B。

关于sql - SQL约束更新问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21306367/

10-16 17:15