我正在使用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
)
);
答案 0 :(得分:1)
您不能使用像这样的在线CTE来执行此操作。您有几种选择。
第一个是UDF和check
约束。本质上,将CTE中的逻辑放在UDF中,然后使用check
约束来验证数据。
第二个是对此表进行检查的触发器。但是,这很棘手,因为计数在同一张表上。
第三项是将总数存储在另一个表中-可能是accounts
-并保持insert
,update
和{{1 } s在此表上。保持该值最新需要在delete
上触发。然后,您可以将loans
约束放在check
上。
我不确定哪种解决方案最适合您的总体架构。第一个最接近您现在正在执行的操作。第三个“发布”计数,因此发生的情况更加清楚。