У меня есть следующие таблицы:
slds:
+-----------+-----------+
| id | sld_name |
+-----------+-----------+
| 1 | google |
+-----------+-----------+
| 2 | github |
+-----------+-----------+
paths:
+-----------+------------+----------+
| 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 ;
Все, что было сделано, - это вообще предотвратить вставки.
Есть что-то конкретное, что не так с триггером?или эта стратегия вообще не работает?
Есть ли лучший подход к этому, который я пропускаю?
Любой совет будет действительно признателен!:)