Précédent   Forum des professionnels en informatique > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
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 14/09/2011, 11h41   #1
Invité de passage
 
Homme
Administrateur systèmes et réseaux
Inscription : septembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Administrateur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : septembre 2011
Messages : 5
Points : 1
Points : 1
Par défaut INSERT INTO dans un champ avec contrainte.

Bonjour à tous.

Je me permets de poster pour parler d'un problème que je rencontre et pour lequel je n'ai pas trouvé de réponse dans les topics existants ni dans la FAQ (partie requête, notamment).
Si j'avais loupé une entrée existante répondant à ce souci, j'en suis désolé !


Développant un petit utilitaire PHP qui interagit avec une base Firebird, j'ai régulièrement besoin de créer ou updater des entrées. Cependant, je suis actuellement embêté car certains champs constituent des clés étrangères et requièrent donc une requête SQL dont j'ignore la bonne nomenclature.

Avec la requête suivante (où param1 est une clé étrangère) :
Code :
1
2
INSERT INTO ma_table(param1,param2,param3)
VALUES ('a','b','c')
j'ai évidemment une erreur : violation of FOREIGN KEY constraint "FK_param1" on table "autre_table"

J'ai testé d'autres nomenclatures comme
Code :
1
2
INSERT INTO ma_table(param1,param2,param3)
VALUES ((SELECT param1 FROM autre_table WHERE param4='x'),'b','c')
(où param4='x' permet de sélectionner le param1 pour qu'il vaille a), mais sans succès.

Sauriez-vous m'indiquer quelle est la bonne forme pour une telle requête ?
N'hésitez pas à demander plus de précisions si mon topic est incomplet.

Merci d'avance !
Brofestor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 11h50   #2
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
le problème n'est pas lié à la requête mais aux contraintes.

Comme "Param1" est une clé étrangère liée à la table "autre_table", as-tu vérifié que la valeur "a" est bien existante dans cette table (autre_table) ?
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 13h42   #3
Invité de passage
 
Homme
Administrateur systèmes et réseaux
Inscription : septembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Administrateur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : septembre 2011
Messages : 5
Points : 1
Points : 1
Merci de ta réponse rapide !

Oui la valeur 'a' existe bien. Actuellement je travaille encore sur une base assez légère qui fait office de test, donc j'ai pas trop de mal à vérifier que tel ou tel truc existe bien.

Mon problème est que si je rentre 'a' en dur, comme dans le premier code que j'ai donné, j'ai l'erreur indiquée et que je ne connais pas la nomenclature pour lui dire d'aller chercher la valeur de la clé pour la mettre.

Petite précision aussi : la requête est exécutée via du PHP (donc fonction ibase avec les paramètres qui vont bien). Je ne crois pas que ça ait une influence mais par souci d'exhaustivité, je le précise.
Brofestor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 14h13   #4
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
???

as tu fais attention à la casse (a versus A), à des espaces éventuels ?...

pourrais-tu fournir le script de ces 2 tables avec les déclarations des clés primaires et secondaires ?
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 09h20   #5
Invité de passage
 
Homme
Administrateur systèmes et réseaux
Inscription : septembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Administrateur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : septembre 2011
Messages : 5
Points : 1
Points : 1
Oui je suis très vigilant à la casse. En l'occurrence a = 101 donc la question ne se pose pas.

Je peux aller chercher les scripts même si je ne suis pas encore très familier avec FB (c'est une table qu'on me fournit et sur laquelle je travaille), mais si je peux me permettre, je ne pense pas que ça soit le souci.

Mon problème me semble assez clair, c'est juste qu'il me manque la bonne nomenclature : je ne peux pas indiquer la clé étrangère en dur (normal) et les quelques formulations comme le deuxième code de mon premier post ne sont pas les bonnes.
J'ai tâché de farfouiller un peu pour trouver comme faire une sql insert dans un champ avec contrainte sur FB, mais peu de résultats sur le net. :/
Brofestor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 12h21   #6
Membre éclairé
 
Avatar de TryExceptEnd
 
Homme
Développeur informatique
Inscription : octobre 2006
Messages : 435
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2006
Messages : 435
Points : 347
Points : 347
Code :
1
2
INSERT INTO ma_table(param1,param2,param3)
VALUES ((SELECT param1 FROM autre_table WHERE param4='x'),'b','c')
Cette requête est parfaitement valable, mais est-tu sur que la sous-requête :
Code :
SELECT param1 FROM autre_table WHERE param4='x'
retourne bien une ligne ?
__________________
Si vous êtes libre, choisissez le Logiciel Libre.
TryExceptEnd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 13h21   #7
Invité de passage
 
Homme
Administrateur systèmes et réseaux
Inscription : septembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Administrateur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : septembre 2011
Messages : 5
Points : 1
Points : 1
Normalement oui, mais bien vu, on va faire pas à pas histoire de spoter le souci ! ^^
Je regarde ça et reviens dire ce qu'il en est.

Merci de confirmer que c'était la bonne requête en tous cas.
Brofestor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 14h34   #8
Invité de passage
 
Homme
Administrateur systèmes et réseaux
Inscription : septembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Administrateur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : septembre 2011
Messages : 5
Points : 1
Points : 1
Je suis une vraie ouiche, j'avais mal géré une des contraintes, c'est pourquoi la requête que je pensais fausse (mais que TryExceptEnd m'a confirmé être finalement bonne) ne fonctionnait pas.

Merci de la rapidité de vos réponses, je pense que du coup je peux mettre en "résolu".
Brofestor est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h45.


 
 
 
 
Partenaires

Hébergement Web