我有下表:
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)
行的插入,因为该路径已经存在于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 ;
这一切都是为了防止插入事件的发生。
触发器是否存在某些特定问题?还是这种策略通常行不通?
我缺少一种更好的方法吗?
任何建议都将不胜感激! :)
答案 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 KEY
比IGNORE
更安全,因为它只捕获重复的键错误,而IGNORE
基本上将 any 错误变成警告(数据类型错误{{ 1}}值放在不可为空的列中,...)。
答案 1 :(得分:0)
如果您向两个表都添加了主键和外键关系,并且还向表添加了唯一约束。在ignore
之后删除insert
。
然后,foreign key and unique key
关系将帮助您停止添加重复项。希望对您有帮助。谢谢