[SQL] delete, insert uitvoeren over 2 tabellen

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Sjoerd
  • Registratie: December 2003
  • Niet online
Even een tabel structuur geven ter introductie ;)

actions
id
title
description

action_permissions
id
actionID
groupID


Vraag 1: Insert
Ik wil een 5 tal "acties" toevoegen aan de actie tabel en meteen een bepaalde groep (met id 255) rechten geven voor deze acties in de action_permissions tabel hoe ik het nu doe:
SQL:
1
2
INSERT INTO  `actions` (`title`,`description`) VALUES (`NEWS_ADMIN_VIEW`, `User has acces to enter view the news admin section`);
INSERT INTO  `action_permissions` (`actionID`,`groupID`) VALUES ((SELECT id FROM post_permissions ORDER BY id DESC LIMIT 1), `255`);


Dat werkt wel (ook omdat niemand anders die database tabellen ooit kan gebruiken voor inserts) maar ik vermoed dat dit simpeler kan of in ieder geval veiliger mochten de tabellen in de toekomst toch een keer wel gebruikt worden?

Vraag 2: Delete
Nu zou ik ook graag die acties ongedaan kunnen maken maar hiervan heb ik echt geen idee wat ik momenteel heb (werkt niet maar geeft weer waar ik heen wil om te beginnen):

DELETE FROM `action_permissions` WHERE (SELECT id FROM actions a join action_permissions ap ON a.id = ap.actionID WHERE a.title LIKE 'NEWS%')

Bovenstaande werkt natuurlijk niet maar wat ik wil is dus eerst alle overeenkomstige rijen in action_permissions verwijderen die linken naar een rij in action waar de title 'NEWS%' is. Ik weet niet of zoiets uberhaupt mogelijk is in 1 query?

Waarom?
Ik ben een module systeem aan het opzetten en bezig met install en uninstall sql scripts, ik wil alles in sql regelen en liever niet met php er nog overheen gaan lopen.

Iemand dus alternatieven voor vraag 1 en een oplossing voor vraag 2? of een duw in de goede kant? :)

Modelbouw - Alles over modelbouw, van RC tot diorama


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 12:26
Voor je eerste probleem kun je de functie LAST_INSERT_ID() gebruiken. Je hebt dan gegarandeerd het nieuwste auto-increment veld van je connectie (wel oppassen als je persistent connecties gebruikt).

Voor je tweede probleem kun je kijken naar FOREIGN KEY constraints. En dan met name ON DELETE CASCADE-functionaliteit. Acties die niet meer bestaan hoeven ook niet meer aan een groep toegekend te zijn.
Maar goed ook zonder de constraints kun je toch een subquery gebruiken om je deletes te regelen:
SQL:
1
2
3
4
DELETE FROM `action_permissions` WHERE `actionid` IN (
    SELECT `id` FROM `actions` WHERE `title` LIKE 'NEWS_%'
);
DELETE FROM  `actions` WHERE `title` LIKE 'NEWS_%';

[ Voor 0% gewijzigd door T-MOB op 19-03-2009 11:41 . Reden: leesbaarheid ]

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • Sjoerd
  • Registratie: December 2003
  • Niet online
T-MOB schreef op donderdag 19 maart 2009 @ 11:40:
Voor je eerste probleem kun je de functie LAST_INSERT_ID() gebruiken. Je hebt dan gegarandeerd het nieuwste auto-increment veld van je connectie (wel oppassen als je persistent connecties gebruikt).

Voor je tweede probleem kun je kijken naar FOREIGN KEY constraints. En dan met name ON DELETE CASCADE-functionaliteit. Acties die niet meer bestaan hoeven ook niet meer aan een groep toegekend te zijn.
Maar goed ook zonder de constraints kun je toch een subquery gebruiken om je deletes te regelen:
SQL:
1
2
3
4
DELETE FROM `action_permissions` WHERE `actionid` IN (
    SELECT `id` FROM `actions` WHERE `title` LIKE 'NEWS_%'
);
DELETE FROM  `actions` WHERE `title` LIKE 'NEWS_%';
LAST_INSERT_ID lijkt altijd "0" terug te geven, bedankt voor je antwoorden, ga even testen met het tweede voorbeeld! _/-\o_

Modelbouw - Alles over modelbouw, van RC tot diorama


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Sjoerd schreef op donderdag 19 maart 2009 @ 13:41:
[...]

LAST_INSERT_ID lijkt altijd "0" terug te geven
Het je je Id column dan wel op AUTO_INCREMENT staan?

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Coltrui
  • Registratie: Maart 2001
  • Niet online

Coltrui

iddqd

Eerste probleem lijkt me triggerwerk?