Delete en cascade

Résolu/Fermé
kawa67 Messages postés 46 Date d'inscription lundi 19 mai 2008 Statut Membre Dernière intervention 2 juin 2009 - 22 mai 2009 à 15:51
 Utilisateur anonyme - 25 mai 2009 à 10:33
Bonjour,
Je développe un logiciel de gestion des erreurs en vb attaquant une base de donnée sql server 2005

voici le script de génération des trois tables concernées
CREATE TABLE SECTEUR
(
    NUMSECTEUR    INTEGER                NOT NULL,
    NOMSECTEUR    VARCHAR(50)                    ,
    PRIMARY KEY (NUMSECTEUR)
);
CREATE UNIQUE INDEX SECTEUR_PK ON SECTEUR (NUMSECTEUR ASC);
CREATE TABLE MACHINE
(
    NUMMACHINE    INTEGER                NOT NULL,
    NOMMACHINE    VARCHAR(50)                    ,
    PRIMARY KEY (NUMMACHINE)
);
CREATE UNIQUE INDEX MACHINE_PK ON MACHINE (NUMMACHINE ASC);
CREATE INDEX DF1_FK ON MACHINE (NUMSECTEUR ASC);
CREATE TABLE PROBLEME
(
    NUMPROBLEME   INTEGER                NOT NULL,
    NUMMACHINE    INTEGER                NOT NULL,
    DATEPROBLEME  VARCHAR(50)                    ,
    DESCRIPTION   VARCHAR(500)                   ,
    PRIMARY KEY (NUMPROBLEME)
);
CREATE UNIQUE INDEX PROBLEME_PK ON PROBLEME (NUMPROBLEME ASC);
CREATE INDEX DF2_FK ON PROBLEME (NUMMACHINE ASC);

Ce que j'aimerais c'est que lorsque je supprime un Secteur, les machines de ce secteur ainsi que les problèmes présent sur les machines appartenant à ce secteur soient supprimées également, pourriez vous m'aider s'il vous plait ?

13 réponses

Utilisateur anonyme
22 mai 2009 à 18:26
Arf donc si je peux t'expliquer rapidement en essayant de coller à ton cas... En fait il faut que tes tables puissent communiquer pour que la base de donnée puisse savoir ce qu'elle doit supprimer, moi je ferais :

CREATE TABLE SECTEUR
(
NUMSECTEUR INTEGER NOT NULL,
NOMSECTEUR VARCHAR(50) ,
PRIMARY KEY (NUMSECTEUR)
);

CREATE TABLE MACHINE
(
NUMMACHINE INTEGER NOT NULL,
NOMMACHINE VARCHAR(50) ,
NUMSECTEUR INTEGER NOT NULL,
PRIMARY KEY (NUMMACHINE),
ADD CONSTRAINT FK_secteur FOREIGN KEY NUMSECTEUR REFERENCES SECTEUR(NUMSECTEUR) ON DELETE CASCADE
);

CREATE TABLE PROBLEME
(
NUMPROBLEME INTEGER NOT NULL,
NUMMACHINE INTEGER NOT NULL,
DATEPROBLEME VARCHAR(50) ,
DESCRIPTION VARCHAR(500) ,
PRIMARY KEY (NUMPROBLEME),
ADD CONSTRAINT FK_machines FOREIGN KEY NUMSECTEUR REFERENCES MACHINE(NUMMACHINE) ON DELETE CASCADE
);

Après les index je me souviens plus, pour ça que j'ai supprimé, mais faut pas que tu les supprime hein! Mais en liant ainsi tes tables et en demandant un delete en cascade, la base de données saura quoi supprimer. J'ai sans doutes oublié des virgules, mais je suis sure que tu te débrouilleras, j'ai une flemme monumentale je relire tout ça...
1
kawa67 Messages postés 46 Date d'inscription lundi 19 mai 2008 Statut Membre Dernière intervention 2 juin 2009 1
22 mai 2009 à 17:09
Si je pouvais avoir un simple exemple de ce qu'il faudrait faire je vous serais reconnaissant
0
kawa67 Messages postés 46 Date d'inscription lundi 19 mai 2008 Statut Membre Dernière intervention 2 juin 2009 1
22 mai 2009 à 17:58
Bon après plusieurs recherches j'ai décidé d'utiliser ceci (merci cyber liz) :


La syntaxe pour ajouter ta contrainte si tu n'en a pas:
ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,...) ON DELETE CASCADE

cependant je ne sais pas trop l'utiliser ...
qu'est ce que "symbol" ????
0
Utilisateur anonyme
22 mai 2009 à 18:04
Salut!

je vois que tu n'as pas de réponse, je ne suis pas une pro en sql, je ne pratique que depuis un an. Pour un delete en cascade cette fonction est bien la bonne. la partie "symbol" entre crochets ne me dit rien, je ne crois pas l'avoir déjà utilisée. Essaie sans...

Cette fonctions tu l'ajoutes dans ta creation de table, à la fin, après avoir crée la table qui contient la clé primaire évidemment. Tu sais comment ça marche les clés primaires et étrangères?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
22 mai 2009 à 18:09
Ah si en fait je sait à quoi ça corespond, autant pour moi... "symbol" est un nom que tu vas donner à ta contrainte afin de pouvoir la retrouver et l'enlever si tu le désires. par exemple tu peux mettre suppression-cascade. Mets un nom assez significatif afin de pouvoir la retrouver de tête. Il y a une convention pour ces noms, si je le retrouve je te le dirai...

Une syntaxe peut être plus communicative pour toi : ADD CONSTRAINT nom_contrainte FOREIGN KEY(champs_fils,...) REFERENCES nom_table_parent (champ_parents) ON DELETE CASCADE
0
kawa67 Messages postés 46 Date d'inscription lundi 19 mai 2008 Statut Membre Dernière intervention 2 juin 2009 1
22 mai 2009 à 18:13
oui disons que je saurais rajouter une clé primaire manuellement allant de ma table secteur a ma table machine par exemple alter table SECTEUR add primary key (NOMSECTEUR)

mais je t'avoue qu'ajouter la contrainte qui fait qu'a chaque suppression de secteur tous ce qui est rattaché a ce secteur uniquement soit supprimer la ça me pose un gros problème ..

En tout cas je te remercie de répondre je commençais a croire que les gens allaient laisser couler ...
0
kawa67 Messages postés 46 Date d'inscription lundi 19 mai 2008 Statut Membre Dernière intervention 2 juin 2009 1
22 mai 2009 à 18:14
je te remercie, je vais essayer ce que tu viens de me dire ^^
0
kawa67 Messages postés 46 Date d'inscription lundi 19 mai 2008 Statut Membre Dernière intervention 2 juin 2009 1
22 mai 2009 à 18:18
alter table MACHINE add constraint supcascade foreign key(NUMSECTEUR) REFERENCES SECTEUR(NUMSECTEUR)

syntaxiquement ceci est très juste, pense tu que j'aurais le résultat souhaité ?

j'essaie ceci dans 5 minutes


Ah oui et pense tu que lorsque je fait ceci ça me supprimera également les références dans problème ou il fraudais que je refasse une autre contrainte cascade ?

je m'explique d'après mes tables un problème dépend d'une machine et une machine dépend d'un secteur.

je voudrais que lorsque je supprime ce secteur cela me supprime et les machines qui en dépendent et les problèmes qui dépendent des machines dépendant des secteurs .... j'espère que je m'exprime correctement.
0
Utilisateur anonyme
22 mai 2009 à 18:29
Il faut que tu rajoutes des champs comme tu as pu le voir! Je te conseille de tout supprimer et de tout refaire proprement, en créant tes tables comme je l'ai mis, en une seule requête, c'est peut être décourageant, mais tu auras plus de chances de ne pas avoir d'erreurs... Et donc les noms de contraintes, pour les clés étrangères, c'est "fk_" devant pour indiquer qu'il s'agit d'une FOREIGN KEY. Et oui en effet il faut une clé étrangère dans chaque table, sinon tes tables ne communiquent pas entre elles!

Et si tu fais comme je l'ai écrit ça devrait marcher pour les suppression en cascade ;) : avec le on delete cascade quand tu vas supprimer une valeur de secteur, la correspondance dans la table machine ne va plus exister et le base de donnée va donc supprimer les valeurs correspondantes, ainsi dans la table problème elle ne va plus trouver la clé étrangère et va supprimer les valeurs correspondantes. Mais il ne faut pas oublier le "on delete cascade".

je suis une cruche pour expliquer, j'espère que tu comprends quand même...
0
kawa67 Messages postés 46 Date d'inscription lundi 19 mai 2008 Statut Membre Dernière intervention 2 juin 2009 1
22 mai 2009 à 19:26
désolé du temps de réponse, repas oblige, oui effectivement j'ai essayer de modifier ça marchait syntaxiquement mais pas dans la fonctionnalité, donc je vais tous supprimer et refaire, je te tient au courant d'ici une demi heure ^^
0
Utilisateur anonyme
22 mai 2009 à 19:45
Je ne pourrais peut être pas répondre avant dimanche, j'espère que tu trouveras la solution! Mais tiens-moi au courant des fois que je puisse passer...
0
kawa67 Messages postés 46 Date d'inscription lundi 19 mai 2008 Statut Membre Dernière intervention 2 juin 2009 1
23 mai 2009 à 16:19
Après une nuit de bagarre avec ma BDD ça marche !!!!!!! mais j'ai dut modifier quelque peu le script de génération des table qui est :

CREATE TABLE SECTEUR
(
NUMSECTEUR INTEGER NOT NULL,
NOMSECTEUR VARCHAR(50) ,
constraint PK_SECTEUR PRIMARY KEY(NUMSECTEUR)
);

CREATE TABLE MACHINE
(
NUMMACHINE INTEGER NOT NULL,
NOMMACHINE VARCHAR(50) ,
NUMSECTEUR INTEGER NOT NULL,
constraint PK_MACHINE PRIMARY KEY (NUMMACHINE),
constraint FK_SECTEUR FOREIGN KEY (NUMSECTEUR) REFERENCES SECTEUR(NUMSECTEUR) on delete cascade
);

CREATE TABLE PROBLEME
(
NUMPROBLEME INTEGER NOT NULL,
NUMMACHINE INTEGER NOT NULL,
DATEPROBLEME VARCHAR(50) ,
DESCRIPTION VARCHAR(500) ,
constraint PK_PROBLEME PRIMARY KEY (NUMPROBLEME),
constraint FK_MACHINE FOREIGN KEY (NUMMACHINE) REFERENCES MACHINE(NUMMACHINE) on delete cascade
);




En tout cas je te remercie drackenshtein !!!!!!
0
Utilisateur anonyme
25 mai 2009 à 10:33
De rien, je suis heureuse si j'ai pu t'aider ;)
0