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 :

Ajouter une primary key


Sujet :

Firebird

  1. #1
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut Ajouter une primary key
    je ne comprend pas tout,

    sur une table existante sans ID unique, je veux lui en ajouté un

    grosso modo je fais ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ALTER TABLE test ADD pk INTEGER NOT NULL;
     
    CREATE GENERATOR g_test;
     
    COMMIT;
     
    UPDATE test SET pk = GEN_ID(g_test, 1);
     
    ALTER TABLE test ADD CONSTRAINT test_pk
      PRIMARY KEY (pk);
    mais la dernière ligne me donne ceci quand je commit (tout le reste passe, j'ai bien des ID, rien de null)

    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
     
    Executing...
    Done.
    1240 fetches, 14 marks, 24 reads, 0 writes.
    3 inserts, 1 updates, 0 deletes, 147 index, 235 seq.
    Delta memory: 101932 bytes.
    RDB$INDEX_SEGMENTS: 1 inserts. 
    RDB$INDICES: 1 inserts. 
    RDB$RELATIONS: 1 updates. 
    RDB$RELATION_CONSTRAINTS: 1 inserts. 
    Total execution time: 0.061s
    Script execution finished.
    Commiting transaction...
    *** IBPP::SQLException ***
    Context: Transaction::Commit
     
    SQL Message : -625
    The insert failed because a column definition includes validation constraints.
     
    Engine Code    : 335544347
    Engine Message :
    validation error for column pk, value "*** null ***"
    je ne comprend vraiment pas d'où ça vient

    il existait une contrainte sur un champ LIBELLE qui servait de clé unique mais je l'ai supprimée

    il existe 3 triggers mais ceux-ci alimentent simplement une table de log sans rapport

    EDIT: j'ai ajouté le code avant le Commit, j'ai supprimé les triggers ça ne change rien, et je peux créer une clé unique sur le champ NOT NULL, mais je ne peux en faire la clé primaire...qui n'existe plus...bizarre non ?

    j'ai trouvé une erreur similaire ici
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    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 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Bonjour Paul,

    je pense qu'il te manque simplement un COMMIT après le UPDATE.
    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
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Bonjour,

    Non, j'ai testé cela, j'ai même relancé le service Firebird avant de créer la clé primaire, rien n'y fait, il me sort toujours cette erreur alors que le champ existe, il est NOT NULL et il contient bien des valeurs croissantes de 1 à n.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    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 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    plus qu'étrange car j'ai fait la même manip que toi et même pousser plus loin en refaisant une deuxième/trosième/etc.. fois le tout via Flamerobin sur FB2.5.2.26540 (pour être précis.)
    voilà le script [Edit] Quel outil/GUI utilises tu ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ALTER TABLE tableacroiser DROP CONSTRAINT TableaCroiser_pk;
    ALTER TABLE tableacroiser DROP PK;
    DROP GENERATOR g_tableacroiser;
    COMMIT;
     
    ALTER TABLE tableacroiser ADD pk INTEGER NOT NULL;
    CREATE GENERATOR g_tableacroiser;
    COMMIT;
     
    UPDATE tableacroiser SET pk = GEN_ID(g_tableacroiser, 1);
    COMMIT; 
     
    ALTER TABLE tableacroiser ADD CONSTRAINT tableacroiser_pk
      PRIMARY KEY (pk);
    et le résultat, comme tu le constateras : aucune erreur

    Starting transaction...
    Preparing query: ALTER TABLE tableacroiser DROP CONSTRAINT TableaCroiser_pk
    Prepare time: 0.063s
    Plan not available.


    Executing...
    Done.
    322 fetches, 5 marks, 12 reads, 0 writes.
    0 inserts, 1 updates, 3 deletes, 41 index, 24 seq.
    Delta memory: 109320 bytes.
    RDB$INDEX_SEGMENTS: 1 deletes.
    RDB$INDICES: 1 deletes.
    RDB$RELATIONS: 1 updates.
    RDB$RELATION_CONSTRAINTS: 1 deletes.
    Total execution time: 0.110s
    Preparing query:
    ALTER TABLE tableacroiser DROP PK
    Prepare time: 0.000s
    Plan not available.


    Executing...
    Done.
    495 fetches, 10 marks, 20 reads, 0 writes.
    0 inserts, 1 updates, 4 deletes, 56 index, 14 seq.
    Delta memory: 217480 bytes.
    RDB$FIELDS: 1 deletes.
    RDB$RELATION_FIELDS: 1 deletes.
    RDB$RELATIONS: 1 updates.
    RDB$RELATION_CONSTRAINTS: 1 deletes.
    RDB$CHECK_CONSTRAINTS: 1 deletes.
    Total execution time: 0.032s
    Preparing query:
    DROP GENERATOR g_tableacroiser
    Prepare time: 0.000s
    Plan not available.


    Executing...
    Done.
    41 fetches, 1 marks, 0 reads, 0 writes.
    0 inserts, 0 updates, 1 deletes, 3 index, 7 seq.
    Delta memory: 6320 bytes.
    RDB$GENERATORS: 1 deletes.
    Total execution time: 0.015s
    Commiting transaction...
    Done.
    Starting transaction...
    Preparing query:

    ALTER TABLE tableacroiser ADD pk INTEGER NOT NULL
    Prepare time: 0.000s
    Plan not available.


    Executing...
    Done.
    150 fetches, 17 marks, 1 reads, 0 writes.
    4 inserts, 1 updates, 0 deletes, 24 index, 0 seq.
    Delta memory: 70864 bytes.
    RDB$FIELDS: 1 inserts.
    RDB$RELATION_FIELDS: 1 inserts.
    RDB$RELATIONS: 1 updates.
    RDB$RELATION_CONSTRAINTS: 1 inserts.
    RDB$CHECK_CONSTRAINTS: 1 inserts.
    Total execution time: 0.016s
    Preparing query:
    CREATE GENERATOR g_tableacroiser
    Prepare time: 0.000s
    Plan not available.


    Executing...
    Done.
    16 fetches, 5 marks, 0 reads, 0 writes.
    1 inserts, 0 updates, 0 deletes, 0 index, 0 seq.
    Delta memory: 12960 bytes.
    RDB$GENERATORS: 1 inserts.
    Total execution time: 0.015s
    Commiting transaction...
    Done.
    Starting transaction...
    Preparing query:

    UPDATE tableacroiser SET pk = GEN_ID(g_tableacroiser, 1)
    Prepare time: 0.000s
    PLAN (TABLEACROISER NATURAL)


    Executing...
    Done.
    122 fetches, 15 marks, 2 reads, 0 writes.
    0 inserts, 5 updates, 0 deletes, 19 index, 5 seq.
    Delta memory: 13984 bytes.
    TABLEACROISER: 5 updates.
    5 rows affected directly.
    Total execution time: 0.000s
    Commiting transaction...
    Done.
    Starting transaction...
    Preparing query:

    ALTER TABLE tableacroiser ADD CONSTRAINT tableacroiser_pk
    PRIMARY KEY (pk)
    Prepare time: 0.016s
    Plan not available.


    Executing...
    Done.
    137 fetches, 12 marks, 0 reads, 0 writes.
    3 inserts, 1 updates, 0 deletes, 14 index, 0 seq.
    Delta memory: 80776 bytes.
    RDB$INDEX_SEGMENTS: 1 inserts.
    RDB$INDICES: 1 inserts.
    RDB$RELATIONS: 1 updates.
    RDB$RELATION_CONSTRAINTS: 1 inserts.
    Total execution time: 0.016s
    Script execution finished.
    Commiting transaction...
    Done.
    Starting transaction...
    Preparing query: ALTER TABLE tableacroiser DROP CONSTRAINT TableaCroiser_pk
    Prepare time: 0.031s
    Plan not available.
    Preparing query:
    ALTER TABLE tableacroiser DROP PK
    Prepare time: 0.000s
    Plan not available.
    Preparing query:
    DROP GENERATOR g_tableacroiser
    Prepare time: 0.015s
    Plan not available.
    Commiting transaction...
    Done.
    Starting transaction...
    Preparing query:

    ALTER TABLE tableacroiser ADD pk INTEGER NOT NULL
    Prepare time: 0.016s
    Plan not available.
    Preparing query:
    CREATE GENERATOR g_tableacroiser
    Prepare time: 0.000s
    Plan not available.
    Commiting transaction...
    Done.
    Starting transaction...
    Preparing query:

    UPDATE tableacroiser SET pk = GEN_ID(g_tableacroiser, 1)
    Prepare time: 0.000s
    PLAN (TABLEACROISER NATURAL)
    Commiting transaction...
    Done.
    Starting transaction...
    Preparing query:

    ALTER TABLE tableacroiser ADD CONSTRAINT tableacroiser_pk
    PRIMARY KEY (pk)
    Prepare time: 0.000s
    Plan not available.
    Script execution finished.
    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 Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    oui, ça doit venir de l'ODS 11.1

    mais j'ai trouvé une parade (enfin on m'a donné la parade sur le bon vieux nzn.fr.delphi )

    le champ doit être créé avec une valeur par défaut, -1 par exemple

    voir les explications ici
    http://www.firebirdsql.org/manual/nu...op-tables.html
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Membre confirmé Avatar de Issam
    Inscrit en
    Mars 2002
    Messages
    578
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Mars 2002
    Messages : 578
    Points : 604
    Points
    604
    Par défaut
    mention spéciale pour le bon vieux nzn.fr.delphi

Discussions similaires

  1. [AC-2010] Ajouter une primary Key à une requête union
    Par gegematic dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 27/02/2014, 16h58
  2. auto-incrémentation sur une primary key avec sql server
    Par pops4 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 24/05/2007, 14h24
  3. [MySQL] Réinitialiser une 'Primary Key'
    Par thannane dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 07/02/2007, 23h04
  4. INDEX utilisé par une Primary Key
    Par Wurlitzer dans le forum Oracle
    Réponses: 2
    Dernier message: 29/06/2006, 11h42
  5. [TYPE DE CHAMPS] Quel type pour une primary key ?
    Par guy2004 dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 25/03/2006, 12h23

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