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

SQLite Discussion :

sqlite3 l'autoincrement ne fonctionne pas


Sujet :

SQLite

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 9
    Par défaut sqlite3 l'autoincrement ne fonctionne pas
    Bonjour à tous,
    j'ai fait une applications sous Qt4qui utilise une bdd sqlite3.
    Lorsque je fais une insertion d'enregistrement celle-ci ne fonctionne que si je renseigne moi même le champ de la clé primaire avec un entier valable (non existant déjà dans la colonne de la clé).

    La table a été crée avec mon programme avec la commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    query.exec("create table clients (id int primary key not null, prenom varchar(20), nom varchar(20))");
    Suivants les instructions suivantes http://www.sqlite.org/faq.html#q1 j'ai inséré dans mon programme l'instruction suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QString chaine_insertion = "insert into clients values (NULL, '12', 'douze')";
    mais celle-ci n'insère rien dans la table alors que l'instruction suivante fonctionne correctement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QString chaine_insertion = "insert into clients values (2, '12', 'douze')";
    Quelq'un peut-il m'expliquer pourquoi?
    Merci de votre aide.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 9
    Par défaut résolu
    J'ai trouvé la réponse sur un autre forum.
    La sintaxe exacte de l'instruction de création de la table doit être la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    query.exec("create table clients (id integer primary key autoincrement unique , prenom varchar(20), nom varchar(20))");
    et ensuite ... bingo ca marche!

    Bonne continuation.

  3. #3
    Membre expérimenté

    Inscrit en
    Décembre 2004
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 169
    Par défaut
    En fait la syntaxe est encore plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    create table clients (
      id integer PRIMARY KEY, 
      prenom varchar(20), 
      nom varchar(20)
    )
    Explications :

    - Le terme unique dans ta requête était inutile : une clé primaire est toujours unique (primary key).

    - Lorsque SQLite trouve un "integer primary key", il l'utilise à la place de la clé primaire interne nommée "rowid"

    - Si on utilise en plus le terme "AUTOINCREMENT" on force SQLite à garder une trace de la dernière clé attribuée dans une table interne (sqlite_sequence), ainsi, non seulement la clé sera unique mais en plus elle prendra toujours une valeur qui n'aura jamais été prise dans la table, même en cas de suppression du dernier enregistrement ou de vidage total. Si c'est bien ce que tu cherches, la syntaxe sera alors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    create table clients (
      id integer PRIMARY KEY AUTOINCREMENT, 
      prenom varchar(20), 
      nom varchar(20)
    )
    - La valeur maximale de ce champ est 9223372036854775807, si on la dépasse il y aura une erreur.

    - Si on veux commencer le champ par une certaine valeur (par exemple 100000), on pourra faire cette manipulation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    delete from clients;
    update sqlite_sequence set seq=100000-1 where name = 'clients';
    Ainsi la table est vidée et la prochaine valeur insérée sera 100000.

    Mais si on ne vide pas la table et que la valeur "seq" est déjà dépassée, la nouvelle valeur de "seq" sera ignorée et la prochaine clé sera max(id) + 1 tout simplement.

    Voilà, ce sera tout pour le fameux 'autoincrément'...
    a+

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 9
    Par défaut
    Effectivement, Bigane, j'ai essayé les 2 instructions que tu proposes et cela fonctionne parfaitement.

    Merci beaucoup pour ton aide.
    a+

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Février 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 15
    Par défaut INSERT et Autoincrement
    j'aimerais ajouter un détail à propos de l'autoincrément et de INSERT:
    la commande suivante permet d'imposer la valeur 2 à la clé primaire (noClient ou ID)
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO Clients VALUES (2, 'victor', 'hugo');
    cette écriture simplifiée oblige à respecter le nombre et l'ordre des champs.

    mais si on veut laisser SQLite gérer le compteur, on peut écrire
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO Clients (prenom, nom) VALUES ('victor', 'hugo');
    ou même
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO Clients (nom, prenom) VALUES ('hugo', 'victor');

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 27/01/2004, 11h14
  2. [FP]Writeln ne fonctionne pas !
    Par néo333 dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 01/11/2003, 23h47
  3. UNION qui ne fonctionne pas
    Par r-zo dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/07/2003, 10h04
  4. Un Hint sur un PopupMenu ne fonctionne pas !!??
    Par momox dans le forum C++Builder
    Réponses: 6
    Dernier message: 26/05/2003, 16h48
  5. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 00h10

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