我有表仓库
:
++++++++++++++
+ 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/