mysql - MySQL在插入触发器之前删除插入条件
问题描述
我有以下表格:
slds:
+-----------+-----------+
| id | sld_name |
+-----------+-----------+
| 1 | google |
+-----------+-----------+
| 2 | github |
+-----------+-----------+
路径:
+-----------+------------+----------+
| id | path_name | sld_id |
+-----------+------------+----------+
| 101 | /cats/ | 1 |
+-----------+------------+----------+
| 102 | /dogs/ | 2 |
+-----------+------------+----------+
请注意,sld_name
是唯一索引,并且sld_id
是 的外键slds
。
INSERT IGNORE INTO paths (path_name, sld_id)
VALUES ('/dogs/', 1), ('/dogs/', 2) ... this can be hundreds of rows long
当上面的示例发生时,我需要一种方法来删除/防止插入附加('/dogs/', 2)
行,因为该路径已经存在 where sld_id=2
,而不是阻止该('/dogs/', 1)
行,因为sld_id=1
还没有/dogs/
路径。
为了实现这一点,我尝试使用这个触发器:
delimiter $$
create trigger after_insert_paths
after insert on paths
for each row begin
declare path_check INT;
set path_check := (
select sld_id
from paths
where path_name=new.path_name and sld_id=new.sld_id
);
if path_check is not null then
set new.path_name = null;
end if;
end $$
delimiter ;
所有这一切都是为了防止插入发生。
触发器是否存在特定问题?还是这种策略一般不起作用?
我缺少更好的方法吗?
任何建议将不胜感激!:)
解决方案
您可以简单地在以下位置创建一个UNIQUE
密钥paths(path_name, sld_id)
:
ALTER TABLE paths ADD UNIQUE paths_idx(path_name, sld_id);
现在,当尝试插入重复项时,MySQL 将引发错误,您可以使用以下ON DUPLICATE KEY UPDATE
功能处理:
INSERT INTO paths (path_name, sld_id) VALUES ('/dogs/', 1)
ON DUPLICATE KEY UPDATE sld_id = sld_id;
ON DUPLICATE KEY
比它更安全,IGNORE
因为它只捕获重复键错误,而IGNORE
基本上将任何错误都变成警告(数据类型错误,NULL
不可为空列中的值,...)。
推荐阅读
- mysql - MySQL中局部变量名的前缀下划线会导致问题吗?
- android - 使用 adreno 650 的 OpenCL 低性能
- r - 通过读取向量中的 url,输入中没有可用的行
- firebase - Algolia + Firestore:安全规则
- javascript - VueJS Computed 中的多个过滤器?
- scala - 来自序列的scala案例类
- windows - CMD:如何检查是否给出了一个或多个参数
- powershell - Powershell Invoke-Expression 找不到与参数名称匹配的参数 = ""
- python - 有没有办法在不显示命令窗口输出的情况下进行 ping 操作?
- c - XC16 - 如何防止将参数 const 数组主体复制到 RAM?