#mysql #sql #sql-delete
#mysql #sql #sql-удалить
Вопрос:
У меня проблема! У меня есть таблица вложений. Я сохраняю имя файла в этой таблице. Моя таблица категорий и вложение связаны друг с другом, если категория удаляется, связанные записи во вложении также удаляются, но я хочу получить имя файла из вложения, прежде чем удалять его!
Что мне делать?
DELETE c, a category c
JOIN attachment a ON c.id = a.extId
WHERE c.lft BETWEEN @left AND @right
Я хочу получить значение имени файла (поле вложения), прежде чем удалять его в верхнем запросе
Ответ №1:
Создайте триггер
DELIMITER $$
CREATE TRIGGER ad_attachment_each AFTER DELETE ON attachment FOR EACH ROW
BEGIN
INSERT INTO deleted_attachments (id, attachment_id, filename, timestamp)
VALUES (null, old.id, old.filename, NOW());
END$$
DELIMITER ;
Этот триггер запускает after
каждый delete
for each row
файл, который удаляется из вложения, и добавляет строку в таблицу «deleted_attachments».
Есть триггеры BEFORE
и AFTER
любое действие.
Действием может быть DELETE
, INSERT
, UPDATE
. К значениям перед изменением можно получить доступ с помощью old
виртуальной таблицы. К значениям после изменения можно получить доступ с помощью new
виртуальной таблицы. Здесь я использовал old
значения, потому что delete
очевидно, что оно не имеет new
значений.
Подробнее о триггерах см.:
http://dev.mysql.com/doc/refman/5.1/en/triggers.html
Или выполните поиск в stackoverflow для mysql triggers
.
Ответ №2:
Выполните два запроса, первый a select
с тем же join
и where
, а второй ваш delete
запрос:
SELECT attachment.filename
FROM attachment AS a
JOIN category AS c ON c.id = a.extId
WHERE c.lft BETWEEN @left AND @right
Ответ №3:
Запросы на удаление не возвращают значения, поэтому я предлагаю вам предварительно выполнить простую инструкцию select, чтобы получить имя файла. Затем выполните инструкцию delete.