|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||||
|
Invité de passage
![]() Inscription : novembre 2007 Messages : 10 ![]() |
Bonjour,
j'ai un petit problème fondamentale de SQL: d'abord les tables: Code :
valeurs de t1 (la clé primaire est bien 1,3,1) Code :
Code :
Code :
je ne comprends pas ou se trouve le probleme: 1- une clé etrangère fait bien référence à une clé primaire (multiple) 2- pour ne pas faire référence à une clé primaire elle même clé étrangère, il y a dans cette clé primaire multiple (de t1) le champs "na" qui n'est pas une référence, qui est unique et non nulle (un index est créé pour na et un autre pour (na,np,nt) ). Le SGBG (ici postgre) devrait pouvoir la retrouver (?) comment récupérer (np,nt) sans passer par les tables d'origines? (c'est le but de la manip) Merci à la communauté, |
||||||||
|
|
00
|
|
|
#2 | |
|
Membre expérimenté
![]() Inscription : octobre 2002 Messages : 654 ![]() |
Coucou,
Je pense que ton problème vient de l'ordre de tes colonnes, il ne faut presque jamais faire un insert into Table1 Values sans spécifier les colonnes , parce que si tu rajoute un champ dans la table ton insert foire. Et là l'ordre de tes colonnes ne semble pas être celui que tu imagines. Donc je propose simplement de spécifier les colonnes Code :
INSERT INTO t2 (np,nt,na) VALUES (3,1,1); Citation:
a+ Soazig |
|
|
|
00
|
|
|
#3 | ||
|
Invité de passage
![]() Inscription : novembre 2007 Messages : 10 ![]() |
tu as raison pour le message d'erreur il s'agit bien de:
Code :
Code :
INSERT INTO t2 (nq,np,nt,na) VALUES (DEFAULT,3,1,1); |
||
|
|
00
|
|
|
#4 |
|
Invité de passage
![]() Inscription : novembre 2007 Messages : 10 ![]() |
Bon j'ai repris le probleme en créant mes tables SANS OIDS et ca fonctionne (?
c'est super ca enleve mon probleme) Mais j'aimerai bien savoir pourquoi ca fonctionne et surtout pourquoi ca ne fonctionnait pas ? quel est le probleme avec l'OIDS ? Je pense que c'est une question qui pourrait intéresser pa mal de personnes.(non ?) Merci à tous, |
|
|
00
|
|
|
#5 | ||
|
Membre éprouvé
![]() Inscription : juillet 2006 Messages : 445 ![]() |
Bonjour,
Comme ça m'intriguait j'ai fait le test complet (en postgres 8.2) : Code :
L'insertion dans t1 est-il bien "commité" ? PS : Il s'agit d'un pb postgres, vous auriez eu plus de réponses dans le forum postgres |
||
|
|
00
|
|
|
#6 |
|
Invité de passage
![]() Inscription : novembre 2007 Messages : 10 ![]() |
désolé au debut je pensais qu'il s'agissait d'un probleme de SQL et pas de posgre. Je me suis trompé.
ton exemple fonctionne chez moi mais pas sur mes tables (???) tu veux dire quoi par "commité" ? (Merci) |
|
|
00
|
|
|
#7 |
|
Membre éprouvé
![]() Inscription : juillet 2006 Messages : 445 ![]() |
"Commité" est un abus de langage, le "commit" est lié à la notion de transaction : http://www.postgresql.org/docs/8.2/i...nsactions.html
En gros : es-tu certain que la valeur 3,1,1 est bien présente dans la base, ou est elle seulement en cours d'insertion dans une autre session ? C'est une piste, si elle ne mène à rien essaie de poser la question dans le forum postgres, des forumeurs plus expérimentés que moi sur ce SGBD te donneront d'autres pistes La question à te poser est : quelle est la différence entre mon exemple qui fonctionne et le tien qui ne fonctionne pas ? |
|
|
00
|
|
|
#8 |
|
Invité de passage
![]() Inscription : novembre 2007 Messages : 10 ![]() |
Merci pour le lien. je n'avais pas lu la doc sur les transactions et c'est très intéressant.
A propos du champs de valeurs (3,1,1), il existe bien (et je l'ai choisi pour ca d'ailleur). C'est bien une clé primaire : je le selectionne sans probleme sur t1, et la description de la table t1 obtenue par la commande me confirme que c'est bie la clé primaire. Mis à part le nom des champs, ma table est bien exactement la meme que t1 (selon la description sur postgre faite par les commandes): A propos de TRANSACTION/COMMIT: Sachant que je remplie mes tables une par une (donc les données d'entrées de références sont bien présente avant le remplissage de la nouvelle table), il ne pouvait pas s'agir d'un probleme de TRANSACTION/COMMIT. Mais: il s'agit peut être de la maniere dont je cree mes tables: j'ecris le code pour creer toutes les tables de ma base dans un fichier texte. Puis je fais un copier/coller de la totalité dans Posgre. Toutes les tables sont crées mais je me suis apercu que certain champs "collais" TRANSACTION automatiquement (???). (NB: il ne s'agit pas d'un probleme d'editeur de texte (emacs) ni de codage!) Est ce le fait de creer les tables a la volée ? (elle sont toutes codées dans le bon ordre et elles sont bien toutes créées) bref, j'ai effacé toutes mes tables et je recommence à zéro (50.10^3 entrées à la poubelle) |
|
|
00
|
|
|
#9 | |
|
Expert Confirmé Sénior
![]() ![]() Inscription : mai 2004 Messages : 4 490 ![]() |
Bonjour,
Citation:
Cela peut être réglé en modifiant les contraintes de clé étrangères en leur ajoutant les mentions DEFERRABLE et INITIALLY DEFERRED (qui décident du moment exact où les contraintes sont vérifiées, en l'occurrence à la fin de la transaction alors que par défaut c'est après chaque instruction, ce qui pose problème ici). Maintenant, il est peut-être plus simple de faire directement exécuter sous le shell ton fichier contenant les commandes SQL (plutôt que de faire un copier/coller), avec une instruction telle que : Avec cette méthode, il n'y pas de transaction "globale" chaque instruction faisant l'objet d'un auto-COMMIT.
__________________
FAQ XML ------------ « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser » Giacomo Leopardi |
|
|
|
00
|
|
|
#10 | ||||
|
Invité de passage
![]() Inscription : novembre 2007 Messages : 10 ![]() |
effectivement il ya avait bien un probleme de TRANSACTION du au copier/coller:
j'ai (re)-créé toutes les tables à la main et c'était.... presque parfait. en effet une décalaration de la clé primaire de ce type: Code :
Les clés ont dut être déclarées "proprement", c.a.d : Code :
1- tout faire dans les règles strictes: fini les copier/coller et éviter tous les racourcis 2- Un grand merci a tous, |
||||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com