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.
Es gibt kein 'StoryId' Feld in Ihrer' Chapters' Tabelle. Meinst du: 'löschen von freq wo storyid = new.id'? – Barranka
@Barranka In der Kapitel-Tabelle gibt es ein StoryId-Feld. Ich habe nur vergessen, das in die Frage aufzunehmen. – HSchmale
Könnten Sie bitte ein Datenbeispiel oder ein [SQL fiddle] (http://sqlfiddle.com) Beispiel veröffentlichen? – Barranka