【问题标题】:Trigger for count number of deletes删除计数触发
【发布时间】:2016-05-09 17:23:40
【问题描述】:

我有一张叫书的桌子

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 行,每一行对应于每本书的删除。

【问题讨论】:

    标签: mysql triggers sql-delete


    【解决方案1】:

    如果您重新定义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
    

    【讨论】:

    • @wchiquito 是的,那会更好。将编辑。
    • @MattRaines 非常感谢,这对我很有帮助。
    • @viversba 嗨,如果他的解决方案对您有用,您可以接受他的回答。请参阅this 了解如何操作。
    猜你喜欢
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多