我试图创建一个触发器,其中插入列中的某些值,如果一个值“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();
2条答案
按热度按时间r7xajy2e1#
下面是如何比较来自diff tbs的两个col
PL/pgSQL示例:
jyztefdp2#
当
work_course_items
记录被更新时,会发生一个update事件。因此,您可以在trigger
中使用该表中的单个记录进行操作。因此,IF
是多余的:您可以简单地将
new.current_attempt_count
传递给`过程,而不是第二个查询,因为触发器中已经有了该值。至于你的第一个查询,它的逻辑是正确的。
你需要实际尝试你实现的任何东西,并确保它正常工作。