Avatar billede hermandsen Juniormester
21. marts 2008 - 15:20 Der er 3 kommentarer og
1 løsning

Before delete trigger som skal lave update på samme tabel

Hej Eksperter

Jeg har følgende tabel:
CREATE TABLE groups (
  id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  parent_id INTEGER UNSIGNED NULL,
  title VARCHAR(255) NOT NULL,
  PRIMARY KEY(id),
  FOREIGN KEY(parent_id)
    REFERENCES groups(id)
      ON DELETE NO ACTION
      ON UPDATE CASCADE
)
TYPE=InnoDB;

Og trigger:
CREATE TRIGGER move_group_up BEFORE DELETE ON groups
FOR EACH ROW
BEGIN
  UPDATE groups SET parent_id = OLD.parent_id WHERE parent_id = OLD.id;
END;

Tanken er at når en gruppe slettes, så flyttes grupperne som tilhører denne, op i samme niveau som den slettede.

Når jeg laver en delete får jeg fejlen:
Can't update table 'groups' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

Jeg forstår godt hvorfor problemet opstår, men synes nu stadig det burde kunne lade sig gøre uden der sker noget træls rekursivt, eller at der opstår en deadlock.

Nogle gode idéer?

//hermandsen
Avatar billede arne_v Ekspert
23. marts 2008 - 05:12 #1
Jeg tror du skal bruge en UPDATE + en DELETE i en enkelt transaktion i enten
en stored procedure eller i data lag i applikationen.
Avatar billede hermandsen Juniormester
23. marts 2008 - 08:37 #2
Okay, det var som jeg frygtede. :(
I så fald virker følgende:

START TRANSACTION;
SET @old = (SELECT parent FROM groups WHERE id = $id);
UPDATE groups SET parent = @old WHERE parent = $id;
DELETE FROM groups WHERE id = 13;
COMMIT;

Så kan jeg lade CakePHP klare min update i beforeDelete, og lave en commit på afterDelete.

Tak arne. Skal vi dele point lige over?

//hermandsen
Avatar billede arne_v Ekspert
23. marts 2008 - 16:28 #3
yes
Avatar billede hermandsen Juniormester
22. marts 2009 - 09:04 #4
Beklager jeg ikke har accepteret svaret før nu.
Det er for sjældent jeg er forbi exp.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester