存在一些语法问题和其他情况,但触发器内部的条件可能类似于以下代码:
首先,(不是对或错)else if可以简化为else。如果第一个条件发现极端,则无需反向检查 not like 极端。 (除非一些奇怪的要求需要处理)
当然,如果对您更有意义,请随时保持else if 检查原样,但我使用了以下代码:
if new.vitamin_name like 'extreme%' then
update vitamin_variety
set price_variety_extreme = new.price;
else
update vitamin_variety
set price_variety = new.price;
end if
“语法问题”:
- 在if条件下,将
vitamin.vitamin_name改为new.vitamin。来自触发器插入操作的列引用自 new,而不是表名。
- 如果保留您原来的
else if,需要更改第1 项中提到的相同vitamin.vitamin_name 引用。
- 维生素插入中不存在引用
new.price_variety_extreme 和 new.price_variety(这些列不在维生素中),但 new.price 存在,而其他 vitamin 列。
“其他情况”:
- 如果
vitamin_variety 表中没有任何行,则不会发生更新,因为没有要更新的行。这种情况会使它看起来好像触发器不工作,但触发器没有什么可以更新的。
- 使用当前信息无法实现对
vitamin_variety 的期望输出。更新会将一个或另一个的所有列设置为最后插入的价格,因为没有唯一的行引用。 (没有 WHERE 子句来限制更新哪些行)
以下是一些交互示例:
正如提到的第一种情况,vitamin_variety 表中没有行,所以我添加了一个:
MariaDB [test]> insert into vitamin_variety (price_variety, price_variety_extreme) values (0, 0);
Query OK, 1 row affected (0.08 sec)
MariaDB [test]> select * from vitamin_variety;
+----+---------------+-----------------------+
| id | price_variety | price_variety_extreme |
+----+---------------+-----------------------+
| 1 | 0 | 0 |
+----+---------------+-----------------------+
1 row in set (0.00 sec)
然后,将触发器添加到vitamin,插入几行:
MariaDB [test]> insert into vitamin( vitamin_name, price ) values ('pilly 5', 7);
Query OK, 1 row affected (0.10 sec)
MariaDB [test]> insert into vitamin( vitamin_name, price ) values ('extreme pill 5', 3);
Query OK, 1 row affected (0.12 sec)
显示那些插入:
MariaDB [test]> select * from vitamin;
+----+----------------+-------+
| id | vitamin_name | price |
+----+----------------+-------+
| 8 | pilly 5 | 7 |
| 9 | extreme pill 5 | 3 |
+----+----------------+-------+
2 rows in set (0.00 sec)
在vitamin_variety 表中显示触发的价格更新:
MariaDB [test]> select * from vitamin_variety;
+----+---------------+-----------------------+
| id | price_variety | price_variety_extreme |
+----+---------------+-----------------------+
| 1 | 7 | 3 |
+----+---------------+-----------------------+
1 row in set (0.00 sec)
=====
编辑:
鉴于此vitamin_variety 表结构,实现目标的一种可能方法:
CREATE TABLE `vitamin_variety` (
`pill_name` varchar(25) NOT NULL,
`price_variety` int(11) NOT NULL DEFAULT '0',
`price_variety_extreme` int(11) NOT NULL DEFAULT '0',
UNIQUE KEY `pill_name` (`pill_name`)
);
然后将vitamin表触发条件改为:
if new.vitamin_name like 'extreme%' then
insert into vitamin_variety (pill_name, price_variety_extreme)
values (replace(new.vitamin_name, 'extreme ', ''), new.price)
on duplicate key update price_variety_extreme = new.price;
else
insert into vitamin_variety (pill_name, price_variety)
values (new.vitamin_name, new.price)
on duplicate key update price_variety = new.price;
end if
然后根据您原来的vitamin 表详细信息运行插入 SQL:
MariaDB [test]> insert into vitamin (vitamin_name, price) values ('extreme pill 1', 10);
Query OK, 1 row affected (0.09 sec)
MariaDB [test]> insert into vitamin (vitamin_name, price) values ('pill 1', 5);
Query OK, 1 row affected (0.16 sec)
MariaDB [test]> insert into vitamin (vitamin_name, price) values ('extreme pill 2', 20);
Query OK, 1 row affected (0.10 sec)
MariaDB [test]> insert into vitamin (vitamin_name, price) values ('pill 2', 10);
Query OK, 1 row affected (0.10 sec)
给予:
MariaDB [test]> select * from vitamin_variety;
+-----------+---------------+-----------------------+
| pill_name | price_variety | price_variety_extreme |
+-----------+---------------+-----------------------+
| pill 1 | 5 | 10 |
| pill 2 | 10 | 20 |
+-----------+---------------+-----------------------+
2 rows in set (0.00 sec)