Postgresql:一个表依赖于另一个表

时间:2015-02-19 16:29:47

标签: database postgresql

我的数据库中有三个表 - StudentsBooksBooks2student

Students表格包含StudentIDFirst NameLast Name

Books表格包含ISBN nonameno. of copies available

我想创建第三个表Books2Students,其中包含StudentIDbooks issuedissue datedue date

  1. 如何创建第三个表格,如果我在其中插入一个记录,则为no。书籍表中的副本应该减少。
  2. 如果我从学生表中删除了一名学生并且该学生已经拿了一本书然后没有。书籍表中的副本应该增加。

2 个答案:

答案 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表本身中保留计算值,但是这样的性能优化会带来自己的成本:)

现在,无论您是这样做还是手动更新列,您都需要确保以并发安全的方式工作(例如,您不会借出比您更多的书籍)。这让你进入“分布式系统很难”的领域:)