Oracle条件插入触发器实现:限制健身类书籍作者数≤3
Oracle 触发器实现方案
核心思路
不需要临时表,直接利用:new前缀获取待插入的书籍ID,关联BOOK表判断分类,再统计该书籍的现有作者数,超过3人则抛出错误阻止插入。
完整触发器代码
假设BOOK表的书籍ID字段为book_id,分类字段为category;BOOKAUTHOR表的书籍ID字段为book_id,作者ID字段为author_id(对应你示例中的'9000000099'和'P105'),触发器代码如下:
CREATE OR REPLACE TRIGGER trg_check_fitness_author_count BEFORE INSERT ON BOOKAUTHOR FOR EACH ROW DECLARE v_book_category BOOK.category%TYPE; v_author_count NUMBER; BEGIN -- 获取待插入书籍的分类 SELECT category INTO v_book_category FROM BOOK WHERE book_id = :new.book_id; -- 如果是FITNESS分类,检查作者总数 IF v_book_category = 'FITNESS' THEN -- 统计该书籍已有的作者数量 SELECT COUNT(*) INTO v_author_count FROM BOOKAUTHOR WHERE book_id = :new.book_id; -- 若已有3位及以上作者,阻止插入 IF v_author_count >= 3 THEN RAISE_APPLICATION_ERROR(-20001, 'FITNESS类书籍作者不能超过3人'); END IF; END IF; EXCEPTION -- 处理书籍不存在的情况(可选) WHEN NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR(-20002, '关联书籍不存在'); END; /
关键细节说明
:new前缀:代表待插入的新记录,:new.book_id就是你要插入的那条BOOKAUTHOR记录中的书籍ID,用来关联BOOK表和统计现有作者数。BEFORE INSERT:必须用前置触发,这样能在数据真正插入数据库前完成校验,不符合条件就直接终止操作。- 错误抛出:用
RAISE_APPLICATION_ERROR自定义错误(错误码范围-20000到-20999),会直接中断插入操作并返回指定提示。
测试验证
当执行你提供的插入语句:
INSERT INTO BOOKAUTHOR VALUES ('9000000099', 'P105');
如果9000000099对应的书籍属于FITNESS分类,且BOOKAUTHOR中已有3位该书籍的作者,触发器会抛出错误,插入操作被阻止。
内容的提问来源于stack exchange,提问作者Lavacave
相关产品推荐
相关产品推荐

