如何在触发器PostgreSQL中比较来自不同表的两个列

ppcbkaq5  于 2023-10-18  发布在  PostgreSQL
关注(0)|答案(2)|浏览(137)

我试图创建一个触发器,其中插入列中的某些值,如果一个值“currentAttemptCount”变得等于或大于另一个表中的另一个“currentCountLimit”
我有两张table。

@Table(name = "course_items")
public class CourseItem {
    @Id
    @Column(name = "course_item_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @Column(name = "attempt_count_limit")
    private Integer attemptCountLimit;

@Table(name = "work_course_items")
public abstract class WorkCourseItem {
    @Id
    @Column(name = "work_course_item_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    protected Integer id;
    @Enumerated(EnumType.STRING)
    protected CourseItemState state;
    @ManyToOne
    @JoinColumn(name = "course_item_id", referencedColumnName = "course_item_id")
    protected CourseItem courseItem;
    @Column(name = "current_attempt_count")
    protected Integer currentAttemptCount;

我应该如何比较这些价值呢?尝试类似next的东西,因为在触发器中似乎不需要INNER JOIN

IF ((SELECT attempt_count_limit
         FROM "ts".course_items
         WHERE course_items.course_item_id = new.course_item_id) <=
        (SELECT current_attempt_count
         FROM "ts".work_course_items
         WHERE work_course_items.work_course_item_id = new.work_course_id))
    THEN
      UPDATE "ts".work_course_items
      SET state = 'YEAP_IT_IS'
      WHERE work_course_item_id = new.work_course_item_id;

    END IF;
    RETURN new;
END;
$$ LANGUAGE PLPGSQL;

CREATE OR REPLACE TRIGGER quiz_attempt_count
   BEFORE UPDATE OF state
   ON "ts".work_course_items
   FOR EACH ROW
EXECUTE PROCEDURE change_work_course_state();
r7xajy2e

r7xajy2e1#

下面是如何比较来自diff tbs的两个col

PL/pgSQL示例:

CREATE OR REPLACE FUNCTION change_work_course_state() RETURNS TRIGGER AS $$
BEGIN
  IF EXISTS (
    SELECT 1
    FROM "ts".course_items ci
    JOIN "ts".work_course_items wci
    ON ci.course_item_id = new.course_item_id
    WHERE ci.attempt_count_limit <= wci.current_attempt_count
  ) THEN
    UPDATE "ts".work_course_items
    SET state = 'YEAP_IT_IS'
    WHERE work_course_item_id = new.work_course_item_id;
  END IF;

  RETURN new;
END;
$$ LANGUAGE PLPGSQL;

CREATE TRIGGER quiz_attempt_count
BEFORE UPDATE OF state
ON "ts".work_course_items
FOR EACH ROW
EXECUTE PROCEDURE change_work_course_state();
jyztefdp

jyztefdp2#

work_course_items记录被更新时,会发生一个update事件。因此,您可以在trigger中使用该表中的单个记录进行操作。因此,IF是多余的:

IF ((SELECT attempt_count_limit
         FROM "ts".course_items
         WHERE course_items.course_item_id = new.course_item_id) <=
        (SELECT current_attempt_count
         FROM "ts".work_course_items
         WHERE work_course_items.work_course_item_id = new.work_course_id))

您可以简单地将new.current_attempt_count传递给`过程,而不是第二个查询,因为触发器中已经有了该值。
至于你的第一个查询,它的逻辑是正确的。
你需要实际尝试你实现的任何东西,并确保它正常工作。

相关问题