mysql - 如何在表上创建插入触发器?

标签 mysql sql triggers

我有表仓库:

++++++++++++++
+ id + count +
++++++++++++++
+ 1  + 10    +
++++++++++++++
+ 10 + 100   +
++++++++++++++
+ 3  + 200   +
++++++++++++++

我想创建触发器,所以如果我插入表中存在的具有值的数据,则该行的计数将被更新,而不会插入新行。如果表中没有具有此类 ID 的数据,则必须添加新行。

预期结果:

查询后:

INSERT INTO Warehouse (id, count) VALUES (1, 15);

仓库表内容将是:

++++++++++++++
+ id + count +
++++++++++++++
+ 1  + 25    +
++++++++++++++
+ 10 + 100   +
++++++++++++++
+ 3  + 200   +
++++++++++++++

在这个查询之后:

INSERT INTO Warehouse (id, count) VALUES (8, 11);

仓库内容将变为:

++++++++++++++
+ id + count +
++++++++++++++
+ 1  + 25    +
++++++++++++++
+ 10 + 100   +
++++++++++++++
+ 3  + 200   +
++++++++++++++
+ 8  + 11    +
++++++++++++++

在此之后:

INSERT INTO Warehouse (id, count) VALUES (3, 5);

仓库内容将变为:

++++++++++++++
+ id + count +
++++++++++++++
+ 1  + 25    +
++++++++++++++
+ 10 + 100   +
++++++++++++++
+ 3  + 205   +
++++++++++++++
+ 8  + 11    +
++++++++++++++

我正在使用 MySQL 5.1。

更新

如果我使用这种方法向 Warehouse 表中插入内容会怎样?

INSERT INTO 
    Warehouse
    (
        count,
        id
    )
    SELECT 
        count,
        id
    FROM 
        ShopOrderGoods
    WHERE 
        order_id = 1

是否有可能通过这种方法获得我想要的行为?

最佳答案

MySQL 不支持INSTEAD OF 触发器;也就是说,不可能使用触发器来执行此操作。

假设 id 列是表的 PRIMARY KEY(或者至少是表上的 UNIQUE KEY),您可以使用 INSERT 语句的 ON DUPLICATE KEY 形式来实现您描述的行为。

例如:

INSERT INTO Warehouse (id, count) VALUES (1, 15)
ON DUPLICATE KEY UPDATE count = count + VALUES(`count`);

MySQL 将尝试插入,如果抛出“重复键”异常,则将尝试更新操作。在上面的示例中,count 列的当前值将添加为该列提供的新值(在插入的 VALUES 子句中)。

(注意:如果 count 列的当前值为 NULL,或者插入的值为 NULL,则 count 列将分配一个 NULL。如果你想将 NULL 值处理为零,那么你可以增强表达式来处理这些情况:

ON DUPLICATE KEY UPDATE `count` = IFNULL(`count`,0) + IFNULL(VALUES(`count`),0)

N.B. 如果表中的另一列具有 AUTO_INCREMENT 属性,则每次插入尝试都会增加表的自动增量,包括那些抛出重复键异常。

更新

(基于问题的更新)

ON DUPLICATE KEY 形式的 INSERT 将与 INSERT ... SELECT 一起工作,就像它与 INSERT ... VALUES 一样.

INSERT INTO Warehouse (count,id)
SELECT s.count, s.id
 FROM ShopOrderGoods s
WHERE s.order_id = 1
   ON DUPLICATE KEY UPDATE `Warehouse`.`count` = `Warehouse`.`count` + VALUES(`count`);

(在我回答的第一个例子中,我用反引号将列名“count”括起来,因为我不确定 COUNT 是否是保留字。它看起来像一个保留字,但我没有检查列表。在最后一个例子中,我没有用反引号括起列名。我从来没有使用“count”作为列名或别名。) 永远不要使用名字)

关于mysql - 如何在表上创建插入触发器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24290398/

相关文章:

sql-server - MSSQL有效触发器INSTEAD OF INSERT

mysql - 电子商务网站如何将图像保存在mysql数据库中并检索它?

mysql - MySql 中时间戳的性能问题

sql - 如何识别 SQL Server 触发器中的操作类型(插入、更新、删除)

mysql - 如何从 MySQL 中的现有表创建另一个表?

PHP:在单个查询中更新多个 MySQL 字段

php - 触发更新mysql值

php - 使用 PHP MYSQL 向表中插入一行

php - 在 MySQL 中创建联系人的历史日志

php - 如何检索存储在数据库中的图像?