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

SQL Firebird Discussion :

Référencement et intégrité


Sujet :

SQL Firebird

  1. #1
    Membre régulier
    Référencement et intégrité
    Bonjour,

    Ma question se rapproche de celle-ci mais ne correspond pas tout à fait à ce que je souhaite.

    J'ai 2 tables, POINT et MESURE définis ci-dessous:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CREATE TABLE POINT (
      ID SMALLINT NOT NULL,
      NOM_POINT VARCHAR(64));
     
    CREATE TABLE MESURE (
      ID SMALLINT NOT NULL,
      NOM_MESURE VARCHAR(100),
      VALEUR_MESURE NUMERIC(12, 2),
      POINT_1 SMALLINT,
      POINT_2 SMALLINT);


    Les champs POINT_1 et POINT_2 de MESURE sont des références de la table POINT. Je pensais mettre 2 clefs étrangères sur MESURE pour m'assurer de l'intégrité de la table mais POINT_1 et POINT_2 ne sont pas forcément saisis. Ils peuvent l'être à l'ajout d'un record, à la modification du record ou pas du tout.

    Je ne sais pas comment vérifier (de manière automatique comme des clefs étrangères) que les valeurs de POINT_1 et POINT_2 font références à des éléments de POINT.

    Je dois implémenter dans les triggers BeforeInsert ou BeforeUpdate ?

    Merci pour vos conseils.

    Lefju

  2. #2
    Rédacteur/Modérateur

    Bonjour,

    Pourquoi des triggers, rien à voir. Il faut simplement créer les contraintes

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    alter table MESURE
    add constraint FK_MESURE_PT1
    foreign key (POINT_1) 
    references POINT (ID)
    on delete SET NULL;
     
    alter table MESURE
    add constraint FK_MESURE_PT2
    foreign key (POINT_2) 
    references POINT (ID)
    on delete SET NULL;


    Note : les ID feraient mieux d'être en BIGINT s'il s'agit de FB3 , GENERATED BY DEFAULT AS IDENTITY,
    les ID des deux tables devraient être en PRIMARY KEY
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  3. #3
    Membre régulier
    Bonjour SergioMaster,

    Merci pour ton message.

    Avec ces contraintes je pourrai créer un record dans MESURE sans renseigner POINT_1 et/ou POINT_2 ?

    Note : les ID feraient mieux d'être en BIGINT s'il s'agit de FB3 , GENERATED BY DEFAULT AS IDENTITY,
    les ID des deux tables devraient être en PRIMARY KEY
    Oui je suis sous FB3, je passerai les ID en BIGINT et mes ID seront en PRIMARY KEY. A quoi correspond GENERATED BY DEFAULT AS IDENTITY ?

    Merci pour tes conseils.

  4. #4
    Rédacteur/Modérateur

    Re,

    Oui, point_1 et point_2 pourront être null.

    A quoi correspond GENERATED BY DEFAULT AS IDENTITY ?
    Cela va faire de la colonne une colonne auto-incrémentée, que les développeurs de Firebird nomment aussi SEQUENCE ou GENERATOR,
    Pas besoin de gérer les numéros, personnellement je préfère la méthode des versions inférieures à base de Trigger mais cela fonctionne très bien
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  5. #5
    Membre régulier
    Merci SergioMaster pour tout !!!

###raw>template_hook.ano_emploi###