觸發器可能是要走的路。如果條件滿足,在表中插入前觸發器可以進行的操作無效,並導致插入操作失敗:
delimiter $$
create trigger keep_three before insert on keys_table for each row
begin
if (select count(serial_key_nbr) from keys_table where user_id = new.user_id) >= 3 then
insert into non_existent_table (non_existent_field) values (new.user_id);
end if;
end$$
delimiter ;
醜陋,但它可能工作。
參考:
另一種解決方案(更好,我認爲)是attepting插入之前強行刪除的條目。當插入次數少於3次時,插入程序正常進行:
delimiter $$
create trigger keep_three before insert on keys_table for each row
begin
while (select count(serial_key_nbr) from keys_table where user_id = new.user_id) >= 3 do
delete from keys_table where user_id = new.user_id
-- OPTIONAL: Add an ordering criteria to define which entry is deleted first
limit 1;
end while;
end$$
delimiter ;
我認爲這樣更清潔。
第三種方法(我發現它here)。這將返回一個錯誤信息(由信令sqlstate 45000
:未處理的用戶定義的異常)與所定義的病症相關:
delimiter $$
create trigger keep_three before insert on keys table for each row
begin
declare msg varchar(255);
declare n int default 0;
set n = (select count(serial_key_nbr) from keys_table where user_id = new.user_id);
if n >= 3 then
set msg = "INSERT failed: There must be only three entries for each user. Delete an entry first";
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
end if;
end$$
delimiter ;
我的第一個選項的清潔器的版本。
使用觸發器(插入前) – Barranka 2014-09-13 19:54:46
這是一個存儲過程? – 2014-09-13 19:54:48
你可以做一個函數查詢來獲取密鑰的數量,如果計數是= 3那麼說他們需要刪除1否則創建新的密鑰? – Parody 2014-09-13 19:55:03