mysql получает значение поля перед удалением

#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.