根据跨多个关系的条件限制关系中的条目数

时间:2019-11-23 16:34:42

标签: sql postgresql

我正在使用PostgreSQL,并试图限制学生可以拥有的并发贷款数量。为此,我创建了一个CTE,该CTE选择了按StudentID分组的所有未归还贷款,并计算每个StudentID的未归还贷款数量。然后,我尝试创建一个检查约束,该约束使用该CTE将学生最多只能拥有7个并发贷款的数量限制为。

下面的代码不起作用,因为它在语法上是无效的,但希望它可以传达我要达到的目的。有谁知道我可以如何实现我期望的贷款限制?

CREATE TABLE loan (
   id SERIAL PRIMARY KEY,
   copy_id INTEGER REFERENCES media_copies (copy_id),
   account_id INT REFERENCES account (id),
   loan_date DATE NOT NULL,
   expiry_date DATE NOT NULL,
   return_date DATE,

   WITH currentStudentLoans (student_id, current_loans) AS
   (
      SELECT account_id, COUNT(*)
      FROM loan
      WHERE account_id IN (SELECT id FROM student)
         AND return_date IS NULL
      GROUP BY account_id
   )

   CONSTRAINT max_student_concurrent_loans CHECK(
      (SELECT current_loans FROM currentStudentLoans) BETWEEN 0 AND 7 
   )
);

对于其他(和可选)上下文,我包括数据库模式的ER图。 enter image description here

1 个答案:

答案 0 :(得分:1)

您不能使用像这样的在线CTE来执行此操作。您有几种选择。

第一个是UDF和check约束。本质上,将CTE中的逻辑放在UDF中,然后使用check约束来验证数据。

第二个是对此表进行检查的触发器。但是,这很棘手,因为计数在同一张表上。

第三项是将总数存储在另一个表中-可能是accounts-并保持insertupdate和{{1 } s在此表上。保持该值最新需要在delete上触发。然后,您可以将loans约束放在check上。

我不确定哪种解决方案最适合您的总体架构。第一个最接近您现在正在执行的操作。第三个“发布”计数,因此发生的情况更加清楚。

相关问题