插入触发器之前的MySQL如果条件

时间:2019-03-08 03:59:28

标签: mysql sql triggers unique-constraint

我有下表:

slds:

+-----------+-----------+
|    id     | sld_name  |  
+-----------+-----------+
|     1     |  google   |  
+-----------+-----------+
|     2     |  github   |
+-----------+-----------+

路径:

+-----------+------------+----------+
|    id     | path_name  |  sld_id  |   
+-----------+------------+----------+
|    101    |  /cats/    |    1     |
+-----------+------------+----------+
|    102    |  /dogs/    |    2     |
+-----------+------------+----------+

请注意,sld_name是唯一索引,sld_idslds的外键。

INSERT IGNORE INTO paths (path_name, sld_id)
VALUES ('/dogs/', 1), ('/dogs/', 2) ... this can be hundreds of rows long

当上面的示例发生时,我需要一种方法来删除/阻止附加的('/dogs/', 2)行的插入,因为该路径已经存在于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 ;

这一切都是为了防止插入事件的发生。

触发器是否存在某些特定问题?还是这种策略通常行不通?

我缺少一种更好的方法吗?

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

2 个答案:

答案 0 :(得分:2)

您只需在UNIQUE上创建一个paths(path_name, sld_id)密钥:

ALTER TABLE paths ADD UNIQUE paths_idx(path_name, sld_id);

现在,当尝试插入重复项时,MySQL将引发一个错误,您可以使用ON DUPLICATE KEY UPDATE feature处理该错误:

INSERT INTO paths (path_name, sld_id) VALUES ('/dogs/', 1)
ON DUPLICATE KEY UPDATE sld_id = sld_id;

ON DUPLICATE KEYIGNORE更安全,因为它只捕获重复的键错误,而IGNORE基本上将 any 错误变成警告(数据类型错误{{ 1}}值放在不可为空的列中,...)。

答案 1 :(得分:0)

如果您向两个表都添加了主键和外键关系,并且还向表添加了唯一约束。在ignore之后删除insert。 然后,foreign key and unique key 关系将帮助您停止添加重复项。希望对您有帮助。谢谢