首页 > 解决方案 > 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 ;

所有这一切都是为了防止插入发生。

触发器是否存在特定问题?还是这种策略一般不起作用?

我缺少更好的方法吗?

任何建议将不胜感激!:)

标签: mysqlsqlsql-insertdatabase-triggerunique-constraint

解决方案


您可以简单地在以下位置创建一个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不可为空列中的值,...)。


推荐阅读