Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/12/2011, 16h27   #1
Candidat au titre de Membre du Club
 
Femme Nathalie
Ingénieur développement logiciels
Inscription : novembre 2009
Messages : 36
Détails du profil
Informations personnelles :
Nom : Femme Nathalie
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Distribution

Informations forums :
Inscription : novembre 2009
Messages : 36
Points : 13
Points : 13
Par défaut Clé étrangère concaténée

Bonjour,

J'aimerais créer une table, jusque là tout va bien . L'un de mes nouveaux champs REF_TRP doit obligatoirement se trouver dans une autre table (donc clé étrangère) mais le hic, c'est que ce nouveau champ n'est pas égal à un champ mais à la concaténation de deux champs.

En gros pour être un peu plus claire : REF_TRP IN SELECT CHAMP1 || CHAMP2 FROM MA_TABLE

Et là... bah... .

J'ai essayé de faire un CHECK dans la création de ma table

Code :
REF_TRP VARCHAR2(10) NOT NULL CHECK (VALUE IN (SELECT CHAMP1 || CHAMP2 FROM MA_TABLE WHERE NUMPOS = 1))
mais j'ai le message : ORA-02251: sous-interrogation non autorisée ici

Du coup j'aimerais bien passer par une clé étrangère mais je ne sais pas du tout comment faire, dans le cas ou c'est possible bien sur.

Avez-vous une idée ?
kyra2778 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 16h38   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 686
Points : 10 435
Points : 10 435
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Il faut que vos colonnes de la clef étrangères soit les mêmes que les colonnes de la clef primaire / unique référencée.

Vous devriez utilisez les deux colonnes dans votre table fille, et gérer la concaténation dans une vue.

En modélisation, l'atomicité des données fait partie de la 1NF, il faut toujours la respecter !
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 17h15   #3
Candidat au titre de Membre du Club
 
Femme Nathalie
Ingénieur développement logiciels
Inscription : novembre 2009
Messages : 36
Détails du profil
Informations personnelles :
Nom : Femme Nathalie
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Distribution

Informations forums :
Inscription : novembre 2009
Messages : 36
Points : 13
Points : 13
J'ai essayé de passer par une vue mais j'obtiens le message suivant :

ORA-02270: pas de correspondance de clé primaire ou unique pour cette liste de colonnes
kyra2778 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 17h22   #4
Membre actif
 
Avatar de Jean_Benoit
 
Inscription : juin 2004
Messages : 495
Détails du profil
Informations personnelles :
Âge : 58

Informations forums :
Inscription : juin 2004
Messages : 495
Points : 182
Points : 182
Bonjour,

J'ai essayé avec un trigger.
Soient les tables:

Code :
1
2
3
4
5
CREATE TABLE jbmliga ( joueur varchar2(30), club varchar2(20), ville varchar2(30) )
 
CREATE TABLE jbmbeaubut( datebut varchar2(30), clubville varchar2(60) )
 
ALTER TABLE jbmliga ADD constraint pk_liga PRIMARY KEY ( joueur )
La colonne clubville est la concaténation de club et ville.

J'ai créé ce trigger:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE OR REPLACE TRIGGER jbm_trg_foreignkey
before UPDATE OR INSERT ON jbmbeaubut
FOR each row
declare
lv_ville jbmliga.ville%type;
lv_club  jbmliga.club%type;
begin
  SELECT ville, club
  INTO lv_ville, lv_club
  FROM jbmliga
  WHERE  club || ville = :new.clubville;
exception
  when no_data_found then
     raise_application_error ( num => -20001, msg => 'clubville  n existe pas' );
end;
J'ai essayé dans Oracle Forms, effectivement si je rentre 'Marseille' en correspondance avec 'BARCABARCELONE', Oracle refuse d'insérer la ligne.

à bien tester en dev.
Astuce pour avoir les erreurs de compil
Code :
SELECT * FROM user_errors
Jean_Benoit est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h16.


 
 
 
 
Partenaires

Hébergement Web