Rechercher : dans
Par :

Clé étrangere sous oracle

Dernière réponse le 15 avr 2008 à 15:05:49 Low, le 13 avr 2008 à 11:58:09 
 Signaler ce message aux modérateurs

Salut tout le monde,

Je voudrais savoir comment mettre deux clés étrangères sur une même table.

Autant pour les clés primaires, c'est simple, par exemple :

CREATE table Associer
( IdActivité Integer NOT NULL,
IdTypeAct Integer NOT NULL,
CONSTRAINT PK_Ass PRIMARY KEY (IdActivité,IdTypeAct)
);

Autant pour la clé étrangère, j'ai essayé pas mal de petit truc mais rien ne marche!
A noter que j'arrive à en mettre une seule sans problème, exemple :

CONSTRAINT FK_LIG FOREIGN KEY (NoLig) REFERENCES ligue (NoLig)

Merci d'avance!!

Meilleures réponses pour « Clé étrangere sous oracle » dans :
La clé 3G : l’outil indispensable pour rester connecté VoirLa clé 3G : l’outil indispensable pour rester connecté De plus en plus séduits par la clé 3G, beaucoup de chefs d’entreprises affirment être...
SQL - Contraintes d'intégrité VoirExpression de contraintes d'intégrité Une contrainte d'intégrité est une clause permettant de contraindre la modification de tables, faite par l'intermédiaire de requêtes d'utilisateurs, afin que les données saisies dans la base soient...
Oracle - Les séquences VoirCet article s'appuie sur la version 8.1.6 d'Oracle. Une séquence est un objet de base de données Oracle, au même titre qu'une table, une vue, etc... Autrement dit, il appartient à un utilisateur, on peut le manipuler, le modifier, à condition...
Clé USB VoirIntroduction à la notion de clé USB Une clé USB (en anglais USB key) est un périphérique de stockage amovible de petit format pouvant être branché sur le port USB d'un ordinateur. Une clé USB embarque dans une coque plastifiée un...

1

jee pee, le 13 avr 2008 à 14:23:40

Bonjour,

normalement la syntaxe serait :

CREATE table Associer
( IdActivité Integer NOT NULL,
IdTypeAct Integer NOT NULL,
CONSTRAINT PK_Ass PRIMARY KEY (IdActivité,IdTypeAct) ,
CONSTRAINT FK_LIG FOREIGN KEY (NoLig) REFERENCES ligue (NoLig) ,
CONSTRAINT FK_XXX FOREIGN KEY (NoXxx) REFERENCES Xxx (NoXxx)
);

il faut au moment de la creation que la/les table/s référencées existent

cdt

Répondre à jee pee

2

Low, le 13 avr 2008 à 19:44:47

Merci pour ta réponse,
Je vais essayer comme ça, mais il me semble que j'avais déjà essayé et qu'il me sortait alors un message d'erreur genre "Il ne peut pas y avoir plus d'une clé étrangère" ou je ne sais plus trop exactement...

Je te tiens au courant.

Répondre à Low

3

jee pee, le 13 avr 2008 à 19:51:46

Ce doit être 2 clé étrangères sur la même table cible l'erreur ?

cela s'écrit normalement :

CONSTRAINT FK_LIG FOREIGN KEY (NoLig,NoXXX) REFERENCES ligue (NoLig,NoXXX)

Répondre à jee pee

4

Low, le 13 avr 2008 à 20:43:41

Possible en effet...
Je test ça demain et je te tiens au courant :)

Encore merci.

Répondre à Low

5

jee pee, le 13 avr 2008 à 20:55:14

Et il faut aussi penser qu'une FK doit faire réference dans la table cible à une PK unique

Répondre à jee pee

6

Low, le 14 avr 2008 à 20:45:50

Hop la !
Ça marche impec, merci des conseils et de tes réponses :)

J'en profite pour te poser une autre question, vu que tu as l'air de t'y connaitre sous oracle :
- Est ce que tu sais comment faire une incrémentation automatique d'une clé primaire sur une table ?

Par exemple, sous access, ça se fait facilement sur les clés primaires...je sais pas si je t'explique bien, en gros :

Imaginons une table Activité :
IdActivité
NomActivité

Je n'aurais pas besoin de m'occuper de IdActivité, car celui ci serait incrémenter tout seul (de 0 à l'infini ...) et donc j'aurais juste à m'occuper de NomActivité. Est ce que tu vois ce que je veux faire ?

Merci d''avoir pris le temps de me lire !

Répondre à Low

7

jee pee, le 14 avr 2008 à 20:54:04

C'est prévu aussi sous oracle :

Prenons l'exemple d'une table "Article" tout ce qu'il y a de plus classique : 
Une clé (PK) 
une référence
un libellé 
un prix 
La clé primaire est renseignée à l'aide d'une séquence. 

CREATE Table Article (
Id Number (10),
Refe VARCHAR2 (16),
Libe VARCHAR2 (64),
Prix NUMBER (12,2));

CREATE SEQUENCE Seq_Id_Article START WITH 1 INCREMENT BY 1;

INSERT INTO Article VALUES (Seq_Id_Article.NextVal, '001', 'Marteau',   7.46);
INSERT INTO Article VALUES (Seq_Id_Article.NextVal, '002', 'Tournevis', 3.83);
INSERT INTO Article VALUES (Seq_Id_Article.NextVal, '004', 'Lime',      5.09);

COMMIT;
 
exemple tiré d'une site qui fait référence et que tu devrais garder dans tes tablettes : http://oracle.developpez.com/cours/

Répondre à jee pee

8

Low, le 14 avr 2008 à 21:50:37

Oui, en effet j'avais plus ou moins lu ça mais je pensais pas que ca pouvait être utile dans mon cas, je m'explique :
C'est une application access avec une BDD sous oracle avec un lien ODBC.

Du coup, le "Seq_xxxxxx.NextVal", je ne sais pas ou le mettre pour que dans les formulaires sous access, tout soit fait automatiquement... :/

Si tu as une idée, je suis preneur :)

A+

Répondre à Low

9

jee pee, le 14 avr 2008 à 21:59:44

Dans ton insert, le seq_xxx.nextval, c'est un champ fixe en "dur" comme si tu mettais 'ABC'

ou tu peux faire avant un select pour le récupérer dans une variable :
select seq_xxx.netval from sys.dual;

Répondre à jee pee

10

Low, le 14 avr 2008 à 22:04:40

Access, c'est spéicla, j'ai pas de insert si tu veux dans mon code VBA, donc impossible de le mettre en dur...
Je vais tenter un truc à base de select comme tu proposes :)

Répondre à Low

11

Low, le 14 avr 2008 à 22:23:06

Bon, il n'y a aucun moyen avec le select, enfin je sais pas comment expliquer mais c'est pas possible :D
Faut que je trouve une autre solution...
On ne peut pas mettre la séquence incrémenté dans le type de donnée, sur la table créé sous oracle ?

Répondre à Low

12

jee pee, le 14 avr 2008 à 22:31:00

Non je crois que le nextval n'est pas autorisé en default value sur une colonne du create table

et comme je ne connais pas du tout access je ne peux pas d'aider plus

Répondre à jee pee

13

Low, le 14 avr 2008 à 22:33:14

Ok, ce n'est pas grave, tu m'as déjà beaucoup aidé :)
Encore merci !

A+

Répondre à Low

14

Low, le 15 avr 2008 à 14:09:23

Au cas ou tu serais pas loin ...
J'ai une question (la dernière je pense, je touche à la fin de mon projet ^^) :

Table Enfant
IdEnfant (clé primaire)
NomEnfant
etc...

Table Appartient
IdEnfant (clé primaire)
IdGroupe (clé primaire)


Table Groupe
IdGroupe (clé primaire)
IntituléGroupe
...

Quand j'essaye de mettre IdGroupe en clé étrangère faisant référence à IdGroupe de Appartient, il me sort :
Pas de correspondance de clé primaire ou unique pour cette liste de colonne.

As tu une idée ?
Si je veux faire ca, c'est parce que je veux mettre "On Delete Casacade" sur cette clé étrangère car quand je supprime un groupe, ce dernier n'est pas supprimé dans Appartient.

Peut être il y a aussi une autre solution, je suis preneur :)

Merci encore et A+

Répondre à Low

15

jee pee, le 15 avr 2008 à 14:32:39

C'est dans Appartient qu'il faut une FK sur idgroupe de la table Groupe

dans ce que je comprends tu as fait l'inverse non ?

Répondre à jee pee

16

 Low, le 15 avr 2008 à 15:05:49

Cool, ça marche impec, et avec le ON DELETE CASCADE aussi ... :D

Pourquoi c'était l'inverse au final ? j'ai pas très bien compris pourquoi dans mon sens, cela ne pouvait pas marcher ?

Répondre à Low