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 :

Comment savoir si une colonne est alias du ROWID ?


Sujet :

SQLite

  1. #1
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 862
    Points : 11 321
    Points
    11 321
    Billets dans le blog
    6
    Par défaut Comment savoir si une colonne est alias du ROWID ?
    Bonjour,

    Voici mon problème : est-il possible de savoir si une colonne d'un ensemble de données résultat d'une requête correspond au ROWID d'une table.

    Je cherche à récupérer cette information soit :
    - par un SQL ;
    - par l'API SQLite.

    La fonction de l'API sqlite3_table_column_metadata permet de savoir si une colonne fait partie d'une clef primaire, à l'instar du SQL PRAGMA table_info(table-name).
    Mais comment être sûr qu'une colonne représente la clef primaire et n'en soit pas seulement une part ?
    Et comment être sûr qu'elle soit assimilable au ROWID ?

    Je suis en train de regarder du côté de ANALYZE table-name et SELECT * FROM sqlite_stat1, mais toutes les idées sont bienvenues !
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  2. #2
    Membre éprouvé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 427
    Points : 1 119
    Points
    1 119
    Par défaut
    Bonjour,

    Lorsque tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select rowid from table
    tu vas trouver soit "rowid" soit le nom de ta colonne dans le nom de colonne renvoyé par SQLITE (sqlite3_column_name)
    NB Il suffit de compiler le SQL (sqlite3_prepare), il n'est pas nécessaire de lancer la requête.

    Cordialment

  3. #3
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 862
    Points : 11 321
    Points
    11 321
    Billets dans le blog
    6
    Par défaut
    Merci pour ton idée, fort séduisante.

    Malheureusement, elle ne fonctionne pas avec la 3.7.17 dans mon test avec une table simple créée comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE TABLE IF NOT EXISTS employes ( id INTEGER PRIMARY KEY , nom TEXT , age INTEGER , photo BLOB )
    Quand je récupère le nom du rowid par sqlite3_column_name, j'obtiens 'rowid' et si je récupère le nom du champ id par sqlite3_column_origin_name, j'obtiens 'id' comme à sa création, bien qu'il soit alias du rowid, mais pas dans une clause AS.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  4. #4
    Membre éprouvé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 427
    Points : 1 119
    Points
    1 119
    Par défaut
    Bonjour,

    Pourtant en utilisant le SQL que tu as donné, j’obtiens bien en passant le SQL suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select rowid from employes
    une réponse Id à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sqlite3_Column_Name(pStmt,ni);
    C'est vrai que je suis sous 3.8.7 mais j'ai le même résultat en revenant sous 3.7.17

    Cordialement

  5. #5
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 862
    Points : 11 321
    Points
    11 321
    Billets dans le blog
    6
    Par défaut
    Ouf !

    En testant plus avant et en cherchant à comprendre pourquoi je n'obtenais pas ce même résultat, je me suis aperçu que :
    1) je n'avais pas effacé la table test
    2) le 'CREATE TABLE IF NOT EXISTS employes ( id INTEGER , nom TEXT , age INTEGER , photo BLOB , PRIMARY KEY(id ASC))' ne change pas la PK d'une table créée avec 'CREATE TABLE IF NOT EXISTS employes ( id INTEGER , nom TEXT , age INTEGER , photo BLOB , PRIMARY KEY (id, age) )' (le 'PRAGMA table_info(employes)' montrant une PK sur 2 champs)...

    J'ai donc appris plein de choses et te remercie pour ta solution qui est bien fonctionnelle
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  6. #6
    Membre éprouvé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 427
    Points : 1 119
    Points
    1 119
    Par défaut
    Bonjour,

    Ouf . Je me suis demandé un moment ce que j'avais raté.

    Attention au DDL de SQLITE. Le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    create table if not exists
    ne modifiera pas la table si elle existe déjà. Cependant le est lui extèmement limité.

    Pour le gérer proprement avec SQLITE, je renomme la table puis je recrée la table avec les nouvelles conditions puis je recopie. Cependant on n'est pas très loin de l'usine à gaz

    Cordialement

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

Discussions similaires

  1. comment savoir si une colonne est primary key d'une table?
    Par vinczente dans le forum Administration
    Réponses: 4
    Dernier message: 13/05/2007, 21h23
  2. comment savoir si une colonne est une clé primaire
    Par freestyler1982 dans le forum Oracle
    Réponses: 1
    Dernier message: 12/09/2006, 08h16
  3. Réponses: 6
    Dernier message: 01/07/2005, 15h06
  4. Comment savoir si une variable est initialisée ?
    Par nabix dans le forum Général Python
    Réponses: 8
    Dernier message: 10/03/2005, 15h12
  5. Comment savoir qu'une fonction est standard ?
    Par D[r]eadLock dans le forum C
    Réponses: 5
    Dernier message: 24/03/2003, 14h42

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