2014-09-13 92 views
0

用戶只能在任何時候最多向其賬戶註冊3個密鑰。要添加新密鑰,用戶必須先刪除另一個密鑰,以便爲新密鑰「騰出空間」。如果符合條件,則插入

我想要這個被檢查服務器端,但我不能讓查詢工作。這是我試過的:

IF (SELECT COUNT(serial_key_nbr) 
FROM keys_table WHERE user_id = 9) <= 2 
THEN INSERT INTO keys_table (user_id, serial_key_nbr) 
VALUES (9, 'abc123') 

如何做到這一點?

+1

使用觸發器(插入前) – Barranka 2014-09-13 19:54:46

+0

這是一個存儲過程? – 2014-09-13 19:54:48

+0

你可以做一個函數查詢來獲取密鑰的數量,如果計數是= 3那麼說他們需要刪除1否則創建新的密鑰? – Parody 2014-09-13 19:55:03

回答

3

您可以使用下面的腳本提到的一樣:

INSERT INTO keys_table (user_id, serial_key_nbr) 
SELECT 9, 'abc123'  FROM DUAL 
WHERE 
(SELECT COUNT(serial_key_nbr) 
FROM keys_table WHERE user_id = 9)<=2 
+0

完美!謝謝。 – Chris 2014-09-13 20:11:59

+0

清潔,簡單和安全。優秀的答案 – Barranka 2014-09-13 20:19:46

2

如果你想使用if做一個條件選擇,那麼我會把它放在一個像這樣的變量中。

BEGIN 

    DECLARE var1 INT; 

    SELECT COUNT(serial_key_nbr) INTO var1 
    FROM keys_table 
    WHERE user_id = 9; 

    IF var1 <= 2 
    THEN 
     INSERT INTO keys_table (user_id, serial_key_nbr) 
     VALUES (9, 'abc123') 

    END IF; 
+0

這是爲了在存儲過程中,對嗎? – Barranka 2014-09-13 20:08:14

+0

@Barranka是的.. OP說他正在使用存儲過程[這裏](http://stackoverflow.com/questions/25827061/insert-into-if-conditions-are-met/25827151#comment40404632_25827061) – 2014-09-13 20:08:53

2

觸發器可能是要走的路。如果條件滿足,在表中插入前觸發器可以進行的操作無效,並導致插入操作失敗:

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 ; 

我的第一個選項的清潔器的版本。

相關問題