触发计数删除次数

时间:2016-05-09 17:23:41

标签: mysql triggers sql-delete

我有这个名为books的表

create table books (price INT,title VARCHAR(50),type VARCHAR(5));

我需要一个触发器,在另一个名为myregister的表中插入当前日期,以及在该日期删除的图书数量。所以我想出了这个:

    CREATE TABLE myregister (dates DATE,number INT);

    DELIMITER |
    CREATE TRIGGER deleted AFTER DELETE on books
    FOR EACH ROW BEGIN
    set @cnt = if(@cnt is null, 1, (@cnt+1));
    set @dat = CURDATE();
    INSERT INTO myregister values(CURDATE(),@cnt);
    END;
    |
    DELIMITER ;

但有两个问题:

  1. 该变量是全局变量,并且每删除一本书都是重要的,与日期无关。

  2. 触发器计算每一行,因此最后,表myregister有n行,每行都删除了一行。

1 个答案:

答案 0 :(得分:0)

如果重新定义myregister表以使dates列唯一,则可以重写触发器以插入行(如果尚不存在)或增量如果是这样的话。

注意:number是MySQL中的保留字。您的触发器可能具有更具体的名称,因为如果为其他表添加更多触发器,deleted将不会显而易见。

CREATE TABLE myregister (dates DATE PRIMARY KEY, `number` INT);

CREATE TRIGGER deleted AFTER DELETE on books
FOR EACH ROW
    INSERT INTO myregister VALUES(CURDATE(), 1)
    ON DUPLICATE KEY UPDATE `number` = `number` + 1;

INSERT INTO books VALUES(1, 'test', 'test'), (2, 'test', 'test'),
   (3, 'test', 'test'), (4, 'test', 'test'), (5, 'test', 'test');

DELETE FROM books;

INSERT INTO books VALUES(1, 'test', 'test'), (2, 'test', 'test'),
   (3, 'test', 'test'), (4, 'test', 'test'), (5, 'test', 'test');

DELETE FROM books;

SELECT * FROM myregister;

-- 2016-05-09,  10