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 :

exprimer une contrainte


Sujet :

Firebird

  1. #1
    Débutant
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Points : 332
    Points
    332
    Par défaut exprimer une contrainte
    J'ai une table Word, qui contient l’ensemble des mots traités. J'ai dessus une contrainte de tables:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    create table T_WORD (
      nuIdWord NUMERIC(18,0) not null,
      vcString VARCHAR(128) not null,
      siIdPOS SMALLINT not null,
      siOccurrence SMALLINT constraint T_WORDsiOccurrence_Chk check ( (siOccurrence >= 1)  OR (siOccurrence IS NULL) ) ,
      siIdLang SMALLINT not null,
      nuIdLemma NUMERIC(18,0) not null, constraint T_WORD_PK primary key (nuIdWord) );
    ca se traduit dans la base de donnée par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CREATE TABLE "T_WORD" 
    (
      "NUIDWORD"	NUMERIC(18, 0) NOT NULL,
      "VCSTRING"	VARCHAR(128) NOT NULL,
      "SIIDPOS"	SMALLINT NOT NULL,
      "SIOCCURRENCE"	SMALLINT,
      "SIIDLANG"	SMALLINT NOT NULL,
      "NUIDLEMMA"	NUMERIC(18, 0) NOT NULL,
    CONSTRAINT "T_WORD_PK" PRIMARY KEY ("NUIDWORD")
    );
    ALTER TABLE "T_WORD" ADD CONSTRAINT "T_LANGUAGE_FK6" FOREIGN KEY ("SIIDLANG") REFERENCES T_LANGUAGE ("SIIDLANG");
    et en résultat j'ai des échecs d'enregistrement sur des enregistrements dupliqués: par exemple le mot "one" est enregistré une première fois comme nombre avec un Part Of Speech de 5, et plus tard on veut l'enregistrer comme un nom avec une POS de 4. C'est grammaticalement justifié, mais infomatiquement j'ai l'impression qu'il y a une contrainte non écrite qui est que le champ vcstring soit unique. La contrainte serait que le couple vcstring siidpos soit unique. comment l'expliciter?
    c'est certainement quelque chose à dire dans le script de création, mais je ne sais pas comment l'exprimer.

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    La contrainte serait que le couple vcstring siidpos soit unique.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    alter table T_WORD
    add constraint UNQ_T_WORD_1
    unique (VCSTRING, SIIDPOS)
    cependant , j'ai l'impression que si
    j'ai des échecs d'enregistrement sur des enregistrements dupliqués
    c'est qu'il s'agit de la valeur de NUIDWORD , est-elle calculée par programme ? ou est-ce un Nombre Généré par Trigger ?
    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

  3. #3
    Débutant
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Points : 332
    Points
    332
    Par défaut le champ nuidword
    est généré par un générateur d'index, je l'ai vérifié et ça fonctionne bie. d'ailleurs les enregistrements refusés se traduisent dans la base par des sauts d'index. Je prend votre suggestion et je reviens vers vous
    actuellement je butte sur des problèmes de syntaxe
    J'ai codé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    alter table T_WORD
      add constraint T_WORD_FK2 foreign key unique
        ( vcString, SiIdPos)
      references T_WORD
        ( vcString, SiIdPos);
    et j'ai comme résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Unsuccessful metadata update
    could not find UNIQUE INDEX with specified columns
    Statement: alter table T_WORD
     add constraint T_WORD_FK2 foreign key (
     vcString, SiIdPos)
     references T_WORD (

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    ce n'est absolument pas ce que j'ai proposé !

    si vous voulez faire un index unique avec VCSTRING et SIIDPOS
    il suffit de faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE UNIQUE INDEX IDX_T_WORD1 ON T_WORD
      (VCSTRING, SIIDPOS);
    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
    Débutant
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Points : 332
    Points
    332
    Par défaut ouff
    J'y suis arrivé avec la requète
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    create table T_WORD (
      nuIdWord NUMERIC(18,0) not null,
      vcString VARCHAR(128) not null,
      siIdPOS SMALLINT not null,
      siOccurrence SMALLINT constraint T_WORDsiOccurrence_Chk check ( (siOccurrence >= 1)  OR (siOccurrence IS NULL) ) ,
      siIdLang SMALLINT not null,
      nuIdLemma NUMERIC(18,0) not null,
      constraint T_WORD_PK primary key (nuIdWord, vcString, SiIdPos));
    fonctionnellement ces champs sont uniques l'id est unique( vérifier dans le debug) et le couple vcString SiIdPos est unique fonctionnellement
    Mais je suis esclave des syntaxes acceptées par l’interpréteur SQL.
    J'ai donc du modifier toutes les tables qui avaient nuIdWord comme clef.
    Je veux bien améliorer ce qui marche mais j'ai besoin de directives plus précises, et vérifiées dans la mesure du possible.

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Je ne suis pas d'accord avec cette structure d'index !
    Si nuIdWord est bien un champ auto-incrémenté (Générateur) , rempli par l'intermédiaire d'un Trigger , ou par une récupération de sa valeur alors un couple VCSTRING, SIIDPOS ne sera pas (forcément) unique

    pour avoir un couple VCSTRING, SIIDPOS unique la solution est soit ce créer un index (mon dernier post) soit de créer une contrainte d'unicité (mon premier post)
    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

  7. #7
    Débutant
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Points : 332
    Points
    332
    Par défaut J'ai toujours un problème
    Lors de l'exécution de la requète
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    INSERT INTO T_WORD (nuIdWord,vcString,siOccurrence,siIdPOS,siIdLang,nuIdLemma) VALUES(125,',',1,10,2,120)
    j'ai comme résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    *** IBPP::SQLException *** Context: Statement::Execute( Message: isc_dsql_execute2 failed SQL Message : -803 Invalid insert or update value(s): object columns are constrained - no 2 table rows can have duplicate column values
    il y a bien un virgule enregistré précédemment sous le POS 22 ( PIVOT)
    mais c'est la première insertion du champ virgule avec le POS 10 (Conjonction)
    et la virgule est enregistrée sous l'identifiant 46
    qui a du être enregistrée par une requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    INSERT INTO T_WORD (nuIdWord,vcString,siOccurrence,siIdPOS,siIdLang,nuIdLemma) VALUES(46,',',1,22,2,46)
    Je ne comprends pas la raison de d'échec de l'écriture

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Alors c'est que votre contrainte d'unicité doit se faire sur le Triplet
    VCSTRING, SIIDPOS,SIOCCURENCE
    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

  9. #9
    Débutant
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Points : 332
    Points
    332
    Par défaut un exemple svp
    Car je n'ai pas pu le faire avec mon interpréteur sql
    à noter que la requête se passe bien pour la table T_LEMMA et mal sur la table T_WORD
    je ne comprend pas ce que vient faire là SIOCCURENCE qui est par essence un champ variable avec le temps
    le champ SiIdWord est unique par construction
    le couple vcString, siIdPos est unique par besoin fonctionnel
    il y a plusieurs exemples de doublets:
    la virgule peut exister en pivot et en conjonction,
    la valeur one peut exister en nom et en nombre,
    la valeur state ou states peuvent être des nom ou des verbes
    etc...
    Au début j'avais des enregistrements de mots et mes states se retrouvaient classés en verbes. C'est pour cela que j'ai introduit le champ siIdPos dans la table Word et depuis j'ai ce status. j'ai essayé de déclarer dans les clefs que c'était deux choses différentes state 12 et state 4, et depuis j'ai des refus d'enregistrement
    je suppose, probablement à tort, car c'est le seul champ qui est duplique que c'est l'existence de deux champs avec vcString identique qui est la cause de l’échec de l’écriture. Mais je ne sais pas pourquoi. Notamment je n'ai pas le même résultat sur la table T_LEMMA.
    Je vous envoie à toutes fin utile le script de création de la base.
    Fichiers attachés Fichiers attachés

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    1°Remarque je suis étonné que votre champ auto-incrémenté ne soit pas directement généré par trigger !

    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
    SET TERM ^ ;
    CREATE TRIGGER T_WORDBI FOR T_WORD ACTIVE
    BEFORE INSERT POSITION 0
    AS
    DECLARE VARIABLE tmp DECIMAL(18,0);
    BEGIN
      IF (NEW. IS NULL) THEN
        NEW.nuIdWord = GEN_ID(GenIdWord, 1);
      ELSE
      BEGIN
        tmp = GEN_ID(GenIdWord, 0);
        if (tmp < new.nuIdWord) then
          tmp = GEN_ID(GenIdWord, new.nuIdWord-tmp);
      END
    END^
    SET TERM ; ^
    Citation Envoyé par JeanNoel53 Voir le message
    il y a plusieurs exemples de doublets:
    il y a plusieurs exemples de doublets:
    la virgule peut exister en pivot et en conjonction,
    la valeur one peut exister en nom et en nombre,
    etc...
    si SIIDPOS correspond a pivot,conjonction,nom,nombre etc... alors
    c'est ceci qu'il faut utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE UNIQUE INDEX IDX_T_WORD1 ON T_WORD
      (VCSTRING, SIIDPOS);


    j'y rajouterais même une contrainte FOREIGN_KEY sur SIIDPOS (par contre comme l'explication des champs et table est confuse je m'avance peut être) appliqué à la Table T_POS()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ADD CONSTRAINT T_WORD_FKPOS  FOREIGN KEY (SIIDPOS)
     REFERENCES T_POS (SIIDPOS);

    je suppose, probablement à tort, car c'est le seul champ qui est duplique que c'est l'existence de deux champs avec vcString identique qui est la cause de l’échec de l’écriture.
    non selon votre écriture c'est le triplet nuIdWord, vcString, SiIdPos qui est la cause de l'erreur

    j'ai exécuté ce script , il ne me lève aucune erreur
    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
    CREATE TABLE T_WORD (
      nuIdWord NUMERIC(18,0) NOT NULL,
      vcString VARCHAR(128) NOT NULL,
      siIdPOS SMALLINT NOT NULL,
      siOccurrence SMALLINT constraint T_WORDsiOccurrence_Chk CHECK ( (siOccurrence >= 1)  OR (siOccurrence IS NULL) ) ,
      siIdLang SMALLINT NOT NULL,
      nuIdLemma NUMERIC(18,0) NOT NULL,
      constraint T_WORD_PK PRIMARY KEY (nuIdWord));
     
    CREATE UNIQUE INDEX IDX_T_WORD1 ON T_WORD
      (VCSTRING, SIIDPOS);
     
    COMMIT;
     
    INSERT INTO T_WORD (nuIdWord,vcString,siOccurrence,siIdPOS,siIdLang,nuIdLemma) VALUES(125,',',1,10,2,120);
    INSERT INTO T_WORD (nuIdWord,vcString,siOccurrence,siIdPOS,siIdLang,nuIdLemma) VALUES(46,',',1,22,2,46);
    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

  11. #11
    Débutant
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Points : 332
    Points
    332
    Par défaut la conclusion
    Dans le script il y avait un statement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    create unique index T_WORD_uniqueness_IDX on T_WORD (
      vcString,
      siIdLang);
    il suffisait de lui substituer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    create unique index T_WORD_uniqueness_IDX on T_WORD (
      vcString,
      siIdPos,
      siIdLang);

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

Discussions similaires

  1. exprimer une contrainte
    Par naazih dans le forum Langage SQL
    Réponses: 1
    Dernier message: 10/05/2006, 21h05
  2. [DEBUTANT] Qu'est-ce qu'une contrainte applicative ?
    Par Invité dans le forum Débuter
    Réponses: 2
    Dernier message: 16/02/2005, 14h18
  3. [SYBASE ASE] Rajouter une contrainte null sur une colonne
    Par Little_Goldo dans le forum Sybase
    Réponses: 1
    Dernier message: 09/02/2005, 10h48
  4. [Interbase] Mettre une contrainte sur un champ
    Par mika dans le forum InterBase
    Réponses: 2
    Dernier message: 26/01/2005, 14h04
  5. [ contrainte ] supprimer une contrainte DB2
    Par hocinema dans le forum DB2
    Réponses: 4
    Dernier message: 08/01/2004, 15h01

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