2016-06-09 10 views
0

Ich versuche, einen Auslöser zu schreiben, um den Wortindex für meine Story-Datenbank ungültig zu machen. Ich kann jedoch nicht herausfinden, wie man den Trigger während des Indexierungsvorgangs daran hindert, erneut zu feuern. Ich weiß, dass ich eine if-Anweisung platzieren muss, um das Update zu stoppen, aber ich kann nicht herausfinden, wie es aussehen soll.Auslöser, um Cache nach Aktualisierung ungültig zu machen

Ich möchte grundsätzlich den Auslöser nur auslösen, wenn IsIndexed ist nicht in der Update-Anweisung gesetzt wurde, die den Auslöser verursacht.

Meine Datenmodell sieht so aus:

Chapters

  • id
  • isIndexed
  • StoryId

Freq

  • Wort
  • storyid
+0

Es gibt kein 'StoryId' Feld in Ihrer' Chapters' Tabelle. Meinst du: 'löschen von freq wo storyid = new.id'? – Barranka

+0

@Barranka In der Kapitel-Tabelle gibt es ein StoryId-Feld. Ich habe nur vergessen, das in die Frage aufzunehmen. – HSchmale

+0

Könnten Sie bitte ein Datenbeispiel oder ein [SQL fiddle] (http://sqlfiddle.com) Beispiel veröffentlichen? – Barranka

Antwort

0

Hier ist mein Vorschlag für Lösung. Ich habe dies auf SQL Geige getestet, und es scheint zu funktionieren:

-- Database setup 
create table chapters (
    id int unsigned not null auto_increment primary key, 
    isIndexed boolean default false, 
    storyId int not null, 
    index idx_storyId(storyId) 
); 

create table freq (
    word varchar(50), 
    storyId int not null, 
    index idx_storyId(storyId) 
); 

delimiter // 
create trigger bi_chapters before update on chapters 
for each row 
begin 
    if new.isIndexed = false then 
    delete from freq where storyId = new.storyId; 
    end if; 
end // 
delimiter ; 

insert into freq(word, storyId) 
values ('one', 1), ('two', 1), ('three', 2); 

insert into chapters(isIndexed, storyId) 
values (true, 1), (true, 2); 

Wenn Sie die Werte von freq wählen (vor dem Update chapters) Sie diese:

select * from chapters; 

| id | isIndexed | storyId | 
|----|-----------|---------| 
| 1 |  false |  1 | 
| 2 |  true |  2 | 

select * from freq; 

| word | storyId | 
|-------|---------| 
| one |  1 | 
| two |  1 | 
| three |  2 | 

nun tun, um eine update In den Kapiteln und select von freq wieder:

update chapters 
    set isIndexed = false 
    where storyId = 1; 
select * from freq; 

| word | storyId | 
|-------|---------| 
| three |  2 | 

Die ich nur Modifikation hat, ist, dass if Block, der prüft, ob die neue Zeile auf false aktualisiert wurde. Wenn ich deine Frage richtig verstanden habe, würde dies tun, was du brauchst.

Verwandte Themen