MySQL перед триггером вставки, который сбрасывает вставку, если условие - PullRequest
0 голосов
/ 08 марта 2019

У меня есть следующие таблицы:

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 ;

Все, что было сделано, - это вообще предотвратить вставки.

Есть что-то конкретное, что не так с триггером?или эта стратегия вообще не работает?

Есть ли лучший подход к этому, который я пропускаю?

Любой совет будет действительно признателен!:)

Ответы [ 2 ]

2 голосов
/ 08 марта 2019

Вы можете просто создать ключ 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 в столбце, не обнуляемом) , ...).

0 голосов
/ 08 марта 2019

Если вы добавили отношение первичного ключа и внешнего ключа к обеим таблицам, а также добавили уникальное ограничение для таблицы.Удалить ignore после insert.Тогда отношение foreign key and unique key поможет вам прекратить добавлять дубликаты.Надеюсь, это поможет вам.Спасибо

...