IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes PostgreSQL Discussion :

[Débutant] Trigger de 2 colonnes


Sujet :

Requêtes PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Inscrit en
    Mai 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 177
    Par défaut [Débutant] Trigger de 2 colonnes
    PostgreSQL 8.4 - pgAdmin 3
    Mac OSX Snow Leopard 10.6

    Bonjour à tous,

    Je suis souveau sur le forum. Je me suis tourné vers PostgreSQL car je monte un projet d'entreprise et ai un souci d'économies.

    PostgreSQL est donc sorti de ce choix puisque le SQL n'a pas l'air si compliqué comme langage (je n'ai pas dit qu'il ne l'était pas).

    Mon but est de créer un tableau de bord de gestion. J'ai donc des tables résumant les produits, les fournisseurs de matière, les emballeurs (contenance), les transporteurs.

    Ce qui nous intéresse ici c'est la relation de tables liées fournisseur/produit. Une fois la logique acquise, j'adapterai.

    Pour certains, la table produit ne sert à rien car il suffit de faire une recherche SELECT FROM WHERE pour avoir l'équivalent. Certes. Mais afficher la table produit requiert moins d'étapes que de faire une demande, d'où un gain de temps important pour moi.

    Si vous le permettez, je vais mettre mes deux tables ci dessous, qui concernent mon problème:

    Ci-dessous, la table fournisseurs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    -- Table: fournisseurs."ident_Fournisseurs"
     
    -- DROP TABLE fournisseurs."ident_Fournisseurs";
     
    CREATE TABLE fournisseurs."ident_Fournisseurs"
    (
      "Id_Fournisseur" integer NOT NULL DEFAULT nextval('fournisseurs."ident_Fournisseurs_Id_seq"'::regclass),
      "Societe" character varying NOT NULL,
      "Interlocuteur" character varying(255),
      "Mail" character varying,
      "Num_1" smallint,
      "Num_2" smallint,
      "Num_Portable" smallint,
      "N°Voie" smallint,
      "Type_Voie" character varying,
      "Nom_Voie" character varying,
      "Code_Postal" integer,
      "Ville" character varying,
      "Pays" character varying NOT NULL,
      "Id_Produit" integer NOT NULL DEFAULT nextval('fournisseurs."ident_Fournisseurs_Id_Produit_seq"'::regclass),
      "Produit" character varying NOT NULL,
      CONSTRAINT "ident_Fournisseurs_pkey" PRIMARY KEY ("Id_Fournisseur", "Id_Produit")
    )
    WITH (
      OIDS=FALSE
    );
    ALTER TABLE fournisseurs."ident_Fournisseurs" OWNER TO postgres;
    COMMENT ON TABLE fournisseurs."ident_Fournisseurs" IS 'Table incluant les fournisseurs + produit(s) qu''ils me vendent.';
    A présent, la table Produits:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    -- Table: produit."Produits"
     
    -- DROP TABLE produit."Produits";
     
    CREATE TABLE produit."Produits"
    (
      "Produit" character varying,
      "Id_Produit" integer NOT NULL,
      "Societe" character varying NOT NULL,
      "Contenance (ml)" integer,
      "Pays" character varying,
      CONSTRAINT "Produits_pkey" PRIMARY KEY ("Id_Produit")
    )
    WITH (
      OIDS=FALSE
    );
    ALTER TABLE produit."Produits" OWNER TO postgres;
    GRANT UPDATE ON TABLE produit."Produits" TO public;
    J'ai réussi, grâce à un script que j'ai créé, à faire en sorte que les produits que j'insère depuis la table fournisseur soient copiés vers la table produit.

    Je montre mon -petit- bout de code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO "produit"."Produits"(
                "Produit", "Id_Produit", "Societe", "Pays")
    SELECT "Produit", "Id_Produit", "Societe", "Pays"
    FROM fournisseurs."ident_Fournisseurs";
    En clair, il me copie correctement les données de fournisseurs vers produits. Mais il ne peut pas le faire deux fois car il y a des redondances.

    Ce que je souhaite c'est que la table produit se mette à jour toute seule, sans redondance, ou qu'elle insère les données si elles n'existent pas lorsque j'ai fini d'intégrer les données de la table fournisseurs.

    Et là, je bloque. Les exemples de triggers ne m'aident alors que je sais que c'est ce dont j'ai besoin.

    Je suis dans l'impasse, je suis preneur ne serait-ce que du moindre indice,

    Merci d'avance, à bientôt,
    LeHibou2

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    Cette conception est étrange. Non pas qu'il ne faille pas de table produit, bien au contraire il faudrait lui donner plus d'indépendance. Dans une conception traditionnelle ça donnerait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    create table produit (
     id_produit int primary key,
     nom_produit text,
     ...autres colonnes...
    );
     
    create table fournisseur (
     ... autre colonnes...
     id_produit int references produit(id_produit) -- référence au produit par son ID unique
    );
    Le fait d'avoir le produit sous la forme d'une colonne dans la table fournisseur suppose au passage qu'un fournisseur a un seul produit ce qui est étonnant. Si un fournisseur peut faire plusieurs produits il faut faire l'inverse, une colonne fournisseur dans la table produit. Sauf si un produit peut aussi avoir plusieurs fournisseurs, auquel cas il faut une 3eme table.

  3. #3
    Membre très actif
    Inscrit en
    Mai 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 177
    Par défaut
    Merci beaucoup,

    En réalité j'avais pris le problème à l'envers (par pure incompétence). Mais je pensais pouvoir faire ce schéma:

    première entrée d'un fournisseur > première entrée d'un produit

    Puis:

    entrée produit d'un fournisseur déjà enregistré > entrée clé fournisseur

    C'est la raison pour laquelle j'avais vu cette idée comme cela.

    Je vais essayer demain car là, je suis trop usé.
    Je vous tiens au courant et merci encore de ce que vous faites,

    A demain,

    LeHibou2

    [EDIT] J'ai tout de même l'impression que REFERENCES ne sort pas beaucoup sur le net. Il est possible que beaucoup s'évertuent à faire des triggers alors que cette fonction suffirait… Enfin je dis cela, je suis déjà au dodo…[/EDIT]

  4. #4
    Membre très actif
    Inscrit en
    Mai 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 177
    Par défaut
    Bonjour à tous,

    Effectivement, votre solution marche super.

    Je me suis rendu compte que je n'avais pas saisi une logique de base des SGDB.

    J'ai corrigé et si cela interesse quelqu'un je peux mettre mes tables en balise.
    Il ne me reste encore qu'à adapter les solution aux autres tables que j'ai créées.

    Ce "References" m'aidera encore beaucoup.

    En tous les cas, je vous remercie de ce que vous faites sur ce forum.

    A bientôt,

    LeHibou2

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. TRIGGER sur des colonnes de la table
    Par hardmehdi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 15/09/2007, 16h36
  2. [SQL2005][débutant]Trigger ou procédure stockée
    Par DebutantDotNet dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 03/10/2006, 11h15
  3. Réponses: 4
    Dernier message: 03/07/2006, 14h59
  4. [[Débutant]trigger+script]
    Par Shooter dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 28/04/2006, 12h08
  5. Trigger sur une colonne ?
    Par hpalpha dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 22/03/2004, 14h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo