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

Firebird Discussion :

Référencement d'un champ d'une table


Sujet :

Firebird

  1. #1
    Membre du Club
    Inscrit en
    Août 2003
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 104
    Points : 53
    Points
    53
    Par défaut Référencement d'un champ d'une table
    Bonjour,
    Je sollicite une aide sur le problème suivant:

    soit deux tables TBL_T1 et TBL_T2 définies de la manière suivante :


    CREATE TABLE TBL_T1
    (
    code_t1 VARCHAR(20) NOT NULL,
    libele_t1 VARCHAR(60),
    PRIMARY KEY(code_t1)
    );

    CREATE TABLE TBL_T2
    (
    code_t2 VARCHAR(20) NOT NULL,
    code_t1 VARCHAR(20) NOT NULL REFERENCES TBL_T1(code_t1),
    libele_t2 VARCHAR(60),
    PRIMARY KEY (code_t2)
    );
    mon problème porte sur la table TBL_T2
    et sur la ligne
    code_t1 VARCHAR(20) NOT NULL REFERENCES TBL_T1(code_t1),
    je voudrais plutôt avoir
    code_t1 VARCHAR(20) NOT NULL SI REFERENCES TBL_T1(code_t1),
    c'est à dire que le code_t2 de la table TBL_T2 peut être NULL. Mais au cas où il n'est pas NULL, il doit être
    référencé sur la table TBL_T1 ( REFERENCES TBL_T1(code_t1) ).

    comment l'exprimer en SQL?

    Merci d'avance pour votre aide.

    dibak

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    bonjour,

    Vous avez défini une primary key sur une colonne varchar, c'est une très mauvaise idée
    Définissez vos PK sur des colonnes small, integer ou bigint selon le nombre d'id requis

    De plus, si vous voulez une base de données intègre, ce qui est la moindre des choses pour une BDD, la référence d'une colonne PK dans une table ou elle est FK est obligatoire et ne souffre d'aucune dérogation !
    Le fait de vouloir rendre la colonne FK nullable dans la table T2, est le plus souvent symptomatique d'une erreur de modélisation au niveau conceptuel.

  3. #3
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut dibak.

    Quel est l'intérêt que vous avez à vouloir dupliquer la colonne "code_t1" en "code_t2" dans la table "tbl_02" ?
    Car si je comprends bien votre problème, c'est exactement la même information, sauf que dans un cas :
    --> "code_t2" est la clef primaire,
    --> "code_t1" est la clef étrangère.

    Or votre question est la suivante :
    Citation Envoyé par dibak
    c'est à dire que le code_t2 de la table TBL_T2 peut être NULL. Mais au cas où il n'est pas NULL, il doit être référencé sur la table TBL_T1 ( REFERENCES TBL_T1(code_t1) ).
    Voici les points suivants :
    1) une clef primaire ne peut pas être nulle. C'est une définition.

    2) Il n'y a aucun intérêt à dupliquer votre clef étrangère en clef primaire.
    si vous avez besoin de mettre votre clef étrangère en clef primaire, il suffit de procéder ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE TBL_T2 (
       code_t2  VARCHAR(20) NOT NULL REFERENCES TBL_T1(code_t1),
      libelle_t2  VARCHAR(60),
      PRIMARY KEY (code_t2)
    );
    3) vous désirez introduire une valeur nulle dans la clef primaire.
    La seule solution possible est de ne pas mettre la colonne "code_t2" (celle de mon exemple ci-dessus) en tant que clef primaire.
    Et bien sûr, de supprimer "NOT NULL" dans la déclarative de la colonne.

    4) votre clef étrangère est un pointeur et c'est une mauvaise idée que de l'avoir déclarée en tant que chaîne de caractères.
    Le mieux est de procéder ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TABLE TBL_T1 (
         code_t1  SMALLINT  generated by default as identity not null primary key,
      libelle_t1  VARCHAR(60)
    ); 
     
    CREATE TABLE TBL_T2 (
         code_t2  SMALLINT  REFERENCES TBL_T1(code_t1),
      libelle_t2  VARCHAR(60)
    );
    5) je pense à juste titre que la modélisation de votre base de données est insuffisante pour résoudre votre problème.
    Une table doit posséder une clef primaire. De part sa définition, elle ne peut pas être nulle.
    Si vous autorisez le marqueur NULL, cela signifie que cette colonne ne peut pas être candidate en tant que clef primaire.
    Il vous faut trouver une nouvelle colonne, candiate en tant que clef primaire.

    Le mieux est d'utiliser un incrément de type technique ("SMALLINT generated by default as identity") en tant que clef primaire.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    @Artemus il me semble que le GENERATED BY DEFAULT AS IDENTITY n'apparait qu'à partir de Firebird 3, cela étant j'utiliserai plutôt un BIGINT (ou INTEGER plutôt qu'un SMALLINT)

    S'il ne s'agit pas de la version 3, il faudra passer par la bonne vieille méthode : un GENERATEUR (aussi nommé SEQUENCE) et un TRIGGER pour gérer l'incrément (voir les FAQ à ce sujet)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut SergioMaster.

    Oui, tu as totalement raison, il s'agit bien de la version 3 de FireBird et ce n'est qu'un détail.
    L'important dans ce sujet est la mauvaise modélisation de l'extrait que nous a donné dibak.
    Il veut à la fois utiliser le marqueur NULL dans la clef primaire et renseigner la clef étrangère afin de respecter l'intégrité de sa base de donnée.
    Le mieux est de ne pas créer la ligne tant qu'il ne connait pas la valeur de ce "code_t1" dans la "tbl_02".
    Et puis, nous ne connaissons pas les contraintes fonctionnelles de ce qu'il cherche à faire.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

Discussions similaires

  1. Référencement d'un champ d'une table sur interbase
    Par dibak dans le forum InterBase
    Réponses: 1
    Dernier message: 18/10/2016, 18h48
  2. Référencement d'un champs d'une table
    Par rolls dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 16/12/2008, 12h15
  3. afficher tous les champs d'une table
    Par julio84 dans le forum ASP
    Réponses: 8
    Dernier message: 19/01/2005, 10h31
  4. Ordre des champs dans une table
    Par patapetz dans le forum Outils
    Réponses: 5
    Dernier message: 30/07/2003, 06h53
  5. Récupération des noms de champs d'une table
    Par Battomura dans le forum SQL
    Réponses: 2
    Dernier message: 24/03/2003, 10h00

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