CREATE TRIGGER bookAvailDelete after delete on Auction
for each row
Begin
if (Select count(OLD.isbn) from Auction a > 0)
update Book b
set available =false
where OLD.isbn = isbn
;
У меня есть две таблицы, аукцион и книга. Аукцион имеет ключ isbn, который ссылается на первичный ключ Book isbn. Многие аукционы могут указывать на одну и ту же книгу, поэтому я хочу, чтобы этот триггер проверял каждый аукцион на удаление, чтобы посмотреть, был ли последний аукцион этой книги isbn. Если это так, то устанавливает "доступный" ключ в книге на false.
Как правило, если только не были соображения производительности, вы просто вычислили это на лету (вместо хранения) с запросами типа:
SELECT b.*
, EXISTS(SELECT * FROM Auction a WHERE a.isbn = b.isbn) AS available
FROM Book b
или (мой предпочтительный формат):
SELECT b.*, (a.isbn IS NOT NULL) AS available
FROM Book b
LEFT JOIN (SELECT DISTINCT isbn FROM Auction) AS a ON b.isbn = a.isbn
;
Прокомментируйте и испытайте ниже. Используйте переменную для подсчета и положите конец, если в конце тоже.
delimiter //
CREATE TRIGGER bookAvailDelete after delete on Auction
for each row
Begin
DECLARE updatecount INT;
set updatecount = ( Select count(*) from Auction a where a.isbn = OLD.isbn);
if updatecount > 0 then
update Book b
set b.available =false
where b.isbn = OLD.isbn;
end if;
End;//
>0
с set updatecount
строки set updatecount
.
Предполагая, что доступно int:
drop trigger bookAvailDelete;
DELIMITER //
CREATE TRIGGER bookAvailDelete after delete on Auction
for each row begin
if NOT EXISTS(Select * from Auction where isbn = old.isbn)
then
update Book b set b.available = 0 where b.isbn = old.isbn;
end if;
end;