2014-01-31 3 views
1

Как прекратить удаление строки, которая имеет PK в другой таблице (без FK) с триггером? Может ли CALL cannot_delete_error прекратить удаление? Это то, что у меня есть.BEFORE DELETE trigger

CREATE TRIGGER T1 
BEFORE DELETE ON Clients 
FOR EACH ROW 
BEGIN 
    SELECT Client, Ref FROM Clients K, Invoice F 
    IF F.Client = K.Ref 
    CALL cannot_delete_error 
END IF; 
END 
+0

'SELECT Client, Ref FROM Clients K, Invoice F' выглядит не так. – BevynQ

+0

Какая версия MySQL вы используете? – peterm

+0

Какая СУБД вы используете? –

ответ

3

Использовать триггер 'INSTEAD OF DELETE'.

В принципе, вы можете оценить, следует ли удалить элемент. В триггере вы можете в конечном счете решить, чтобы удалить этот пункт как:

--test to see if you actually should delete it. 


--if you do decide to delete it 
DELETE FROM MyTable 
WHERE ID IN (SELECT ID FROM deleted) 

одна сторона к сведению, помните, что «удалено» таблица может быть несколько строк.

Еще одна заметка стороны, попробуйте сделать это за пределами db, если это возможно! Или с предыдущим запросом. Триггеры просто трудно поддерживать. Простой запрос или функция (например, dbo.udf_CanIDeleteThis() ') могут быть гораздо более универсальными.

0

Если вы используете MySQL 5.5 или выше вы можете использовать SIGNAL

DELIMITER // 
CREATE TRIGGER tg_fk_check 
BEFORE DELETE ON clients 
FOR EACH ROW 
BEGIN 
    IF EXISTS(SELECT * 
       FROM invoices 
      WHERE client_id = OLD.client_id) THEN 
    SIGNAL sqlstate '45000' 
     SET message_text = 'Cannot delete a parent row: child rows exist'; 
    END IF; 
END// 
DELIMITER ; 

Вот SQLFiddle демо. Раскомментируйте последнее удаление и нажмите Build Schema, чтобы увидеть его в действии.

Смежные вопросы