我正在尝试定义一个触发器,该触发器将检查特定值的条目数,如果该数字大于3,则禁止输入该特定行的新行。但它会抛出错误。 这是我的代码:
delimiter $$
CREATE TRIGGER `timeslotattendantcheck`
BEFORE INSERT ON `attendants`
FOR EACH ROW
BEGIN
DECLARE v_dup int;
SET v_dup = (SELECT COUNT(*) from attendants where attendant = NEW.attendant);
if v_dup > 3 then
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Too many attendants for one time slot. The insert is cancelled.';
end if;
end $$
delimiter ;
答案 0 :(得分:0)
SIGNAL。你需要升级到至少5.5,而且5.6已经考虑了很长一段时间,所以你可能会考虑升级到那个。
如果你使用innodb,如果表变大,这个表将无法扩展。鉴于innodb计数()的MVCC性质不是MyIASM中的快速原子查找。更大的表可能需要几分钟才能运行计数()。这意味着每次插入尝试都将受到限制。
答案 1 :(得分:0)
我在MySQL 5.1中使用的技巧在满足某些条件时引发触发错误:
创建不可插入的视图,例如:
CREATE OR REPLACE VIEW no_edit_view AS
SELECT 1 FROM dual
如果您需要引发错误,请尝试在此视图中插入值:
INSERT INTO no_edit_view VALUES (1);
你得到的错误如下:“ INSERT的目标表no_edit_view无法插入”
是的,错误消息不友好,但如果您无法升级MySQL服务器,则会解决此问题。
然后你的触发器:
CREATE TRIGGER `timeslotattendantcheck`
BEFORE INSERT ON `attendants`
FOR EACH ROW
BEGIN
DECLARE v_dup int;
SET v_dup = (SELECT COUNT(*) from attendants where attendant = NEW.attendant);
if v_dup > 3 then
-- SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Too many attendants for one time slot. The insert is cancelled.';
-- workaround:
INSERT INTO no_edit_view VALUES (1);
end if;
end $$