ЕСЛИ НЕ СУЩЕСТВУЕТ в триггере

У меня есть две таблицы concept_access и concept_access_log. Я хочу создать триггер, который срабатывает каждый раз, когда что-то удаляется из concept_access, проверяет, есть ли похожая запись в таблице журнала, а если нет, вставляет новую перед удалением из concept_access.

Я изменил триггер, и теперь он выглядит так. это:

DROP TRIGGER IF EXISTS before_delete_concept_access;
DELIMITER //
CREATE TRIGGER before_delete_concept_access
    BEFORE DELETE ON `concept_access` FOR EACH ROW
    BEGIN
        IF (SELECT 1 FROM concept_access_log WHERE map=OLD.map 
                          AND accesstype=OLD.accesstype AND startdate=OLD.startdate AND stopdate=OLD.stopdate) IS NULL THEN
            INSERT INTO concept_access_log (map, accesstype, startdate, stopdate)
            VALUES (OLD.map, OLD.accesstype, OLD.startdate, OLD.stopdate);
        END IF;
    END//
DELIMITER ;

Пример данных в concept_access перед удалением:

map accesstype  startdate   stopdate
1   public      NULL        NULL    
1   loggedin    2011-05-11  NULL    
1   friends     NULL        NULL    

Таблица журнала уже имеет первые 2 строки. И они точно такие же, как в concept_access. Когда я удаляю первую строку из таблицы concept_access, я получаю следующее в таблице журнала:

map accesstype  startdate   stopdate
1   public      NULL        NULL    
1   loggedin    2011-05-11  NULL    
1   friends     NULL        NULL    
1   public      NULL        NULL    

Хотя вставлять что-либо не предполагается, потому что (1, public, null, null) там уже существует.

Эта таблица не имеет первичного ключа . Я не создавал структуру, поэтому не спрашивайте меня, почему. Его изменение испортит многие уже существующие функции. Мне просто нужно вести журнал того, что было удалено из таблицы concept_access , и сохранять это в журнале без дубликатов.

Я был бы очень признателен, если бы кто-нибудь мог понять, что происходит не так.

9
задан Jull 10 May 2011 в 04:31
поделиться