我希望有一个表格,您可以在其中拥有主键的最大行数(例如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以及相应的行数。
答案 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语句中使用这个变量。