我的数据库中有三个表 - Students
,Books
和Books2student
。
Students
表格包含StudentID
,First Name
,Last Name
。
Books
表格包含ISBN no
,name
,no. of copies available
。
我想创建第三个表Books2Students
,其中包含StudentID
,books issued
,issue date
,due date
。
答案 0 :(得分:0)
您可以使用触发器。这太简单了。 请参阅教程:http://www.postgresqltutorial.com/creating-first-trigger-postgresql/
忽略性能部分(这很重要),这是一个您应该适应表格列的示例:
---------Creating function-----------
CREATE OR REPLACE FUNCTION student_to_book(p_ID)
RETURNS trigger AS
$BODY$
BEGIN
IF (TG_OP = 'INSERT') THEN
UPDATE Books2Students BS
SET BS.noCopies= noCopies+1
WHERE BS.BOOKS_ISSUED=p_ID;
RETURN NEW;
ELSIF (TG_OP = 'DELETE') THEN
UPDATE Books2Students BS
SET BS.noCopies= noCopies-1
WHERE BS.BOOKS_ISSUED=p_ID;
RETURN OLD;
END IF;
RETURN NULL;
END;
$BODY$
---------Creating TRIGGER-----------
CREATE TRIGGER student_manage
BEFORE INSERT OR DELETE
ON STUDENT
FOR EACH ROW
EXECUTE PROCEDURE student_to_book(ROW.StudentID);
答案 1 :(得分:0)
你看错了方法。 Books表应该只有总副本数,而不是您现在需要的数量。当您查询实际可用书籍数量时,您将减去已借出的金额。您可能会发现,出于性能原因,您希望在book表本身中保留计算值,但是这样的性能优化会带来自己的成本:)
现在,无论您是这样做还是手动更新列,您都需要确保以并发安全的方式工作(例如,您不会借出比您更多的书籍)。这让你进入“分布式系统很难”的领域:)