【问题标题】:Error in trigger function in PostgreSQLPostgreSQL 中的触发函数错误
【发布时间】:2015-03-19 18:18:26
【问题描述】:

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

  • Students 表有StudentID, First_Name, Last_Name

  • Books 表有ISBN_no, name, no. of copies available

  • Books2Students 具有StudentID, books issued, issue date, due date 的表。

我想创建一个触发器,当一个学生从books2students 中删除时,Books 表中的no. of copies 应该增加,如果我在books2student 中插入一本书,那么书籍中的no of copies 应该减少.

我写了一个函数和触发器,但函数中出现错误

CREATE FUNCTION student_to_book()   RETURNS trigger AS  '
BEGIN
  IF tg_op = ''DELETE'' THEN
        UPDATE books 
        SET books.no_of_copies_available = no_of_copies_available+1
        WHERE Books2Students.Book_Issued=books.ISBN_no;

  END IF;
  IF tg_op = ''INSERT'' THEN
        UPDATE books  
        SET books.no_of_copies_available = no_of_copies_available-1
        WHERE Books2Students.Book_Issued=books.ISBN_no;   

  END IF;
END
' LANGUAGE plpgsql;                                                     

我得到错误一个错误:

ERROR: missing FROM-clause entry for table "books2students"
  Where: PL/pgSQL function student_to_book() line 10 at SQL statement

【问题讨论】:

  • 要引用正在插入或删除的行(已触发触发器),语法为NEW.book_issuedOLD.book_issued 而不是Books2Students.Book_Issued。这就是错误的原因。有关更多信息,请参阅 postgres 文档。

标签: database postgresql triggers plpgsql


【解决方案1】:

存在多个问题。这可能有效:

CREATE OR REPLACE FUNCTION student_to_book()
  RETURNS trigger
  LANGUAGE plpgsql AS
$func$
BEGIN
   IF TG_OP = 'DELETE' THEN
      UPDATE books 
      SET    no_of_copies_available = no_of_copies_available + 1
      WHERE  ISBN_no = OLD.Book_Issued;

   ELSIF TG_OP = 'INSERT' THEN
      UPDATE books  
      SET    no_of_copies_available = no_of_copies_available - 1
      WHERE  ISBN_no = NEW.Book_Issued;
   END IF;
END
$func$;

这还不包括TG_OP = UPDATE,但...

MATERIALIZED VIEW 通常是跟踪每本书数量的更好方法。

【讨论】:

    【解决方案2】:

    您收到错误是因为您在 WHERE 子句中引用表 books2students 但没有 FROM 子句。我假设触发器是针对这个表的,所以你可以在更新部分使用关键字NEW,在删除部分使用关键字OLD,而不是表名。像这样:

    IF tg_op = ''INSERT'' THEN
    UPDATE books
      SET books.no_of_copies_available = no_of_copies_available-1
      WHERE NEW.Book_Issued=books.ISBN_no;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-19
      • 1970-01-01
      • 1970-01-01
      • 2020-09-19
      • 2015-07-18
      • 2017-08-02
      • 1970-01-01
      相关资源
      最近更新 更多