限制主键的最大条目

时间:2014-12-08 21:09:56

标签: mysql sql triggers phpmyadmin max

我希望有一个表格,您可以在其中拥有主键的最大行数(例如3)。如果主键已有三行,而另一行已添加,则应删除另一行。

示例:我有一个如下所示的表:

####################################
#   PrimaryKey  |   AnotherValue   #
####################################
|    abcdef     |       123        |
|    abcdef     |       456        |
|    abcdef     |       789        |
|    xyz123     |       sdf        |
|    xyz123     |       5s6        |
|    789klm     |       w8a        |
|    789klm     |       a4d        |
____________________________________

我尝试使用以下内容创建TRIGGER,每个PrimaryKey最多只允许三个条目...

 CREATE TRIGGER maxThreeEntries AFTER INSERT ON table
   BEGIN
     DELETE FROM table WHERE (
        SELECT PrimaryKey, COUNT(PrimaryKey)
        FROM table
        GROUP BY PrimaryKey
        HAVING COUNT(PrimaryKey) > 3
     );
   END;

......不编译。

内部SELECT - 单独使用时 - 可以满足我的需要,并返回PrimaryKey以及相应的行数。

2 个答案:

答案 0 :(得分:1)

试试这个:

CREATE TRIGGER maxThreeEntries AFTER INSERT ON table
       BEGIN
         DELETE FROM table WHERE PrimaryKey IN (
            SELECT PrimaryKey
            FROM table
            GROUP BY PrimaryKey
            HAVING COUNT(PrimaryKey) > 3
         );
       END;

您需要比较删除WHERE子句中的内容。您可能还希望在SELECT语句中添加WHERE子句,以确保只查找触发器查找的主键。我不确定如何在mySQL中执行此操作,我主要使用SQL-Server

答案 1 :(得分:1)

我找到了以下解决方案。有两个触发器。在插入触发器检查是否存在具有给定primaryKey的三行之前。如果是这样,那么它会改变主要关键字'插入行到某个特定值。插入触发器后删除此行。

CREATE or replace TRIGGER maxThree BEFORE INSERT ON my_table for each row       
    BEGIN
        DECLARE pkc integer;
        SET @pkc := (select count(*) from my_table where primaryKey=new.primaryKey);

        if pkc>2 then
            new.primaryKey:='aaaaaaaaaa';
        end if;       
    END;

CREATE or replace TRIGGER maxThreeAI AFTER INSERT ON my_table 
    BEGIN
        delete from my_table where primaryKey='aaaaaaaaaa';
    END;

此解决方案有一个限制。我们为primaryKey选择了一些特定的值。我选择了' aaaaaaaaaa'。但是如果你想插入带有这样的primaryKey的行,那么就不会插入这一行。

将行插入此表后会发生什么:

insert into my_table(primaryKey, anotherValue) values('abc', '111');  -- row inserted
insert into my_table(primaryKey, anotherValue) values('abc', '222');  -- row inserted
insert into my_table(primaryKey, anotherValue) values('abc', '333');  -- row inserted

insert into my_table(primaryKey, anotherValue) values('abc', '444');  
-- this fourth row will not be inserted. 
-- First trigger will change 'primaryKey' value of this row to 'aaaaaaaaaa' 
-- and row ('aaaaaaaaaa', '444')  will be inserted.
-- But then second insert will call 
delete from my_table where primaryKey='aaaaaaaaaa';
-- and this command will delete this fourth row.

因此,在这四个插入之后,表中只有前三行。

我宣布变量' pkc'。在插入另一行之前,我会将具有primaryKey的行计为与' primaryKey'相同的行。这一新行。此计数保存到变量pkc(select into)。然后我在if语句中使用这个变量。