Vous n'êtes pas identifié(e).
Bonjour,
Tout d'abord, désolé pour le sujet du message : j'avoue avoir beaucoup peiné à trouver un titre résumant ma problématique... Si quelqu'un a une idée , lâchez-vous !
Voilà mon cas :
Je dispose d'une table operation_reseau reliée à 5 tables : geo_1, geo_2, geo_3, geo_4 et geo_5 avec les structures suivantes :
- operation_reseau (ope_id, ope_date, ope_commune, ope_commentaire)
- geo_1(gid, matricule, longueur, ope_id)
- geo_2(gid, matricule, longueur, ope_id)
- geo_3(gid, matricule, longueur, ope_id)
- geo_4(gid, matricule, longueur, ope_id)
- geo_5(gid, matricule, longueur, ope_id)
Le principe est que je peux avoir plusieurs enregistrements dans une table geo_x correspondant à un unique enregistrement dans la table operation_reseau (relation 1 - n). Deuxième point important : un enregistrement de la table operation_reseau ne peut faire référence qu'à une seule table geo_x.
Je souhaite écrire une requête qui me permette de mettre en forme un tableau du genre :
ope_id | Table geo | Nombre d'enregistrements
------------------------------------------------------------------------
1 | geo_1 | 3
2 | geo_3 | 1
3 | geo_2 | 8
4 | geo_5 | 2
> Par exemple : l'enregistrement de la table operation_reseau dont ope_id = 1 fait référence à 3 enregistrements de la table geo_1.
Le souci est qu'il faudrait que je réussisse à détecter à quelle table geo_x un enregistrement donné de la table operation_reseau fait référence, puis à rapatrier le nom de la table dans la colonne Table geo de ma requête. J'ai déjà un bout de script mais le problème est que je ne tape que dans la table geo_1 et je ne récupère pas son nom :
SELECT a.ope_id, COUNT(geo_1.gid) AS "Nombre d'enregistrements"
FROM operation_reseau a
LEFT JOIN geo_1 b ON a.gid = b.ope_id
GROUP BY a.ope_id ;
Quelqu'un pourrait-il m'aider à compléter le script ?
Merci beaucoup d'avance,
Thomas
Merci ! C'est exactement ce que je cherchais... Je m'étais un peu perdu dans les règles.
Bonne journée,
Thomas
Bonjour,
Je cherche à maintenir à jour le contenu d'une colonne avec la même valeur. Par exemple, j'ai créé une nouvelle colonne obj et je voudrais qu'elle comporte toujours la valeur « 1 » (lors de l'ajout de nouveaux enregistrements notamment). Comment puis-je fixer cela ? Je pense qu'il s'agit d'une règle à mettre en application mais je ne trouve pas d'exemples précis en dehors de la doc où je me perds un peu... Merci d'avance pour votre aide sur ce sujet !
Thomas
Bonjour,
Merci pour vos réponses ! Je vais tester ça dès lundi et je vous tiens au courant. En fait, je me suis aperçu qu'en passant ma requête dans une vue, les libellés TRUE et FALSE apparaissaient correctement (seul l'affichage du résultat de la requête dans la fenêtre SQL semblait concerné par ces « f » et « t »). Etant donné que je passe par une vue, peu importe que je perde le type booléen : l'important est que ce type le reste dans la table concernée, non ? L'objectif au final est d'afficher ces informations sur un site web.
Thomas
Bonjour,
Lors d'une requête avec jointures (LEFT JOIN) pour rassembler des colonnes issues de différentes tables, je me retrouve avec le problème suivant : mon résultat de requête affiche les libellés « f » ou « t » alors que les champs booléens contiennent les libellés TRUE ou FALSE dans les tables. Je ne trouve pas d'explication dans la doc, sinon que plusieurs libellés sont possibles... Deux questions me viennent :
1. Est-il possible de corriger ça pour obtenir TRUE ou FALSE dans le résultat de requête également ?
2. Est-il possible de manière générale de déterminer les libellés à afficher ?
Merci pour votre aide !
Thomas
Re,
Après une journée de recherches, impossible de mettre le doigt sur un cas d'école... Et pourtant, ça doit être une situation courante. Je tourne autour du pot avec la clause RETURNING [ colonne ] qui permet à une instruction SELECT / INSERT de renvoyer la valeur serial affectée par le SGBD. Mais je ne vois pas comment gérer ça en PHP...
Si je reprends mon exemple du premier message, je peux avoir plusieurs agents pour une même intervention. Cela signifie que la création d'une ligne dans la table intervention peut impliquer la création de plusieurs lignes dans la table intervention_agent...
Si quelqu'un a une idée, vraiment je suis en galère !
Merci !
Thomas
Bonjour,
Je travaille sur la création d'une base de données qui sera alimentée par des formulaires HTML/CSS avec du PHP pour la récupération des informations saisies et l'écriture dans la base (classique, j'imagine). Je m'interroge sur la gestion des clés étrangères. Un exemple simple avec les tables suivantes :
- intervention (int_id, int_date, int_type)
- agent (age_id, age_prenom, age_nom)
- intervention_agent (int_id, age_id)
La table intervention_agent stocke les correspondances entre les tables intervention et agent car il peut y avoir plusieurs agents pour une même intervention.
En PHP, je procède de la manière suivante (volontairement simplifiée mais c'est pour le principe) :
1. Récupération des informations saisies dans des variables
$date = $_POST['date'];
$type = $_POST['type'];
$prenom = $_POST['prenom'];
$nom = $_POST['nom'];
2. Requêtes d'écriture des informations dans les tables :
$rqt_intervention = $bdd->prepare('INSERT INTO intervention (int_id, int_date, int_type) VALUES ('', '$date', '$type');');
$rqt_intervention->execute();
$rqt_intervention_agent = $bdd->prepare('INSERT INTO intervention_agent (int_id, age_id) VALUES ( ??? );');
$rqt_intervention_agent->execute();
Comment se gère l'écriture des clés étrangères dans la table intervention_agent ? En effet, j'ai bien paramétré les champs int_id et age_id comme clés primaires dans PostgreSQL, donc mes requêtes d'écriture laissent vides ces champs qui seront automatiquement numérotés à la suite par PostgreSQL lors de l'écriture. Mais quelles valeurs dois-je indiquer dans ma requête d'écriture dans la table intervention_agent (cf. mes points d'interrogation dans la dernière requête ci-dessus) ? Là, je ne vois pas bien comment ça se passe, sur le principe...
Merci par avance pour votre aide !
Thomas
Merci beaucoup !
Thomas
Bonjour,
Tout est dans le sujet. Que pourrais-je ajouter à cette instruction pour positionner la colonne à ajouter par rapport aux autres ?
ALTER TABLE intervention ADD COLUMN int_astreinte boolean;
J'ai essayé un AFTER colonne qui fonctionne a priori pour mySQL, sans succès...
Merci pour votre aide !
Thomas
Merci beaucoup !
Thomas
Bonjour,
C'est clair, merci beaucoup ! Je posais la question par rapport à l'utilisation de l'action référentielle RESTRICT. D'après ce que j'ai compris, celle-ci se paramètre au niveau de la clé étrangère (ici : int_cam_id) et définit les répercutions sur la table qui référence (intervention) d'actions effectuées sur la table de référence (camion).
Par exemple, écrire ON DELETE RESTRICT indique qu'il sera nécessaire qu'aucune ligne de la table intervention ne fasse référence à un camion donné pour pouvoir supprimer ce camion de la table camion. Ecrire ON DELETE CASCADE indique que la suppression d'un camion donné de la table camion aura pour conséquence la suppression des lignes de la table intervention qui le référencent. Même comportement avec les ON UPDATE RESTRICT / CASCADE pour les mises à jour (les modifications apportées aux enregistrements de la table de référence).
C'est bien ça ? J'aurais juste besoin de savoir si j'ai bien interprété les choses...
Bonne journée et merci encore !
Thomas
Bonjour,
Je me perds un peu dans des termes relatifs aux clés étrangères donnés dans la documentation mais pas expliqués plus clairement que ça, visiblement...
Si je prends un exemple simple :
> une table camion avec les attributs : cam_id, cam_immatriculation
> une table intervention avec les attributs : int_id, int_date, int_duree et int_cam_id
La table intervention comporte une clé étrangère qui est la clé primaire de la table camion.
Questions :
- Quelle est la table référençant ?
- Quelles sont les colonnes et lignes référencées ?
- Quelles sont les lignes de référence ?
- Quelles lignes référencent quelles lignes ?
Merci beaucoup !
Thomas
Oui, l'utilisateur a bien les droits sur le schéma !
En passant par la console psql, j'ai les infos sur un autre schéma que celui sur lequel je travaille... Comment spécifier la commande \dt+ sur un schéma particulier dans ce cas ?
Thomas
Dites-moi plus précisément ce que vous voulez que je teste, je ne comprends pas...
Bonjour,
Toutes les tables sont dans le même schéma, que je précise en réalité dans mon script (retiré dans l'exemple pour une meilleure lisibilité).
Pour les OWNER et les droits (GRANT), c'est plus mélangé...
La relation operation_reseau :
ALTER TABLE operation_reseau OWNER TO simapdatagrp;
GRANT ALL ON TABLE operation_reseau TO siveergrp;
La relation anomalie :
ALTER TABLE anomalie OWNER TO siveergrp;
GRANT ALL ON TABLE anomalie TO siveergrp;
Et je suis connecté avec l'utilisateur postgres pour créer les tables... Qu'est-ce qui peut poser problème (le fait que l'utilisateur connecté soit différent des OWNER prévus) ?
Merci !
Thomas
Bonjour,
J'ai créé deux tables (operation_reseau et anomalie) et je dois en créer une troisième qui comporte en clés étrangères les clés primaires de chacune des deux autres.
Mon script donne ça :
CREATE TABLE operation_anomalie
(
ope_id integer REFERENCES operation_reseau (ope_id),
ano_id integer REFERENCES anomalie (ano_id),
CONSTRAINT operation_anomalie_pkey PRIMARY KEY (ope_id, ano_id)
);
Et j'obtiens le message d'erreur suivant :
NOTICE: la table « operation_anomalie » n'existe pas, poursuite du traitement
NOTICE: CREATE TABLE / PRIMARY KEY créera un index implicite « operation_anomalie_pkey » pour la table « operation_anomalie »
ERREUR: la relation « operation_reseau » n'existe pas
********** Erreur **********
ERREUR: la relation « operation_reseau » n'existe pas
État SQL :42P01
Bizarre ce message car les deux tables (relations) existent bel et bien...
Quelqu'un voit-il d'où ça pourrait venir ?
Merci !
Thomas
Bonjour,
Je viens de trouver tout seul !
La ligne suivante était inutile (l'index spatial n'ayant jamais été créé, PostgreSQL n’aimait pas le fait que je lui demande de commencer par le supprimer...) :
DROP INDEX operation_reseau_the_geom_gist;
Thomas
Bonjour,
J'essaie de créer une table avec le script suivant :
DROP TABLE IF EXISTS operation_reseau ;
CREATE TABLE operation_reseau
(
ope_id serial NOT NULL,
ope_num_rue smallint,
ope_date_debut date,
ope_date_fin date,
ope_facturee boolean,
ope_commentaire text,
the_geom geometry(Point),
ope_insee character varying(255),
ope_image character varying(255),
CONSTRAINT operation_reseau_pkey PRIMARY KEY (ope_id)
);
DROP INDEX operation_reseau_the_geom_gist;
CREATE INDEX operation_reseau_the_geom_gist ON operation_reseau USING gist (the_geom);
J'obtiens l'erreur suivante :
ERREUR: l'index « operation_reseau_the_geom_gist » n'existe pas
État SQL :42704
Je ne vois pas d'où vient le problème... Bien sûr, j'ai créé une base de données sur le modèle template_postgis_20 donc la géométrie est prise en charge via la cartouche spatiale PostGIS. J'ai copié un script de création d'une table existante et disposant d'une colonne the_geom, donc rien inventé a priori.
Merci par avance pour vos avis !
Thomas
Merci pour vos réponses ! Je trouve d'emblée aussi plus logique de paramétrer a minima dans PGSQL... Je vais faire les deux !
Thomas
Bonjour,
Je me pose la question suivante : je suis entrain de créer une base de données PostgreSQL. Celle-ci sera alimentée grâce à des formulaires. J'hésite entre poser des contraintes de clés étrangères dans PostgreSQL directement (ex : table1_gid integer REFERENCES table1 dans la table2) et utiliser des vérifications dans le code PHP... Mes profs me conseilleraient plutôt la première piste tandis que des professionnels utilisateurs de PostgreSQL me conseilleraient plutôt les vérifications PHP. Je ne sais pas quoi faire et surtout pas me rendre compte des inconvénients de chaque scénario.
Quels conseils pourriez-vous me donner ?
Merci par avance !
Thomas
Merci ! Ça répond bien à ce que je cherchais... De peur de faire des bêtises, je passerai plutôt par le protocole décrit dans un précédent post.
Bonne journée,
Thomas
par contre si vous voulez changer d' utilisateur a la volé sans vous déconnecter il suffit de faire un set search_path.
Peux-tu donner le code complet s'il te plaît (avec un exemple d'un utilisateur factice) ? C'est à taper dans la fenêtre SQL ?
Thomas
Merci, en effet ! Résumé de la manip :
1. Clic-droit sur le serveur > Se déconnecter du serveur
2. Clic-droit sur le serveur > Propriétés > Onglet Propriétés > Changer le Nom utilisateur
3. Double-clic sur le serveur pour relancer la connexion
Il est en effet nécessaire de se déconnecter du serveur au préalable, sinon les options de Propriétés > Onglet Propriétés sont grisées et non modifiables...
Thomas
Bonjour,
Je cherche à me connecter à une base de données avec un autre rôle que celui utilisé par défaut ? Lorsque je lance un SELECT current_user, je vois que je suis connecté avec postgres (rôle créé par défaut) mais il existe 5 autres rôles avec des droits d'accès spécifiques...
Merci pour votre aide !
Thomas
OK super, c'est juste ça que je voulais savoir. Je m'étais juste « un peu » embrouillé avec la doc en ligne...
Bonne fin de journée !
Thomas