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 :

double cle primaire


Sujet :

SQLite

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 9
    Par défaut double cle primaire
    Bonjour
    Est t'il possible de creer avec SQLite, une table avec deux clés primaire dont une en AUTOINCREMENT.
    J'ai essaye directement par un script mais aussi avec des outils comme sqliteadmin, ca ne veut pas passer.
    Pour prevenir les questions du genre : pourquoi tu veux faire çà? Je veux pouvoir representer un lien identifiant.

    Merci pour vos réponses

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 349
    Par défaut
    Salut !

    Tu ne peux avoir qu'une seule clé primaire par table. Par contre il est possible de créer une clé primaire à partir de deux champs d'une table.

    ++

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 9
    Par défaut
    Citation Envoyé par SesechXP
    Salut !

    Tu ne peux avoir qu'une seule clé primaire par table. Par contre il est possible de créer une clé primaire à partir de deux champs d'une table.

    ++
    Merci de me repondre.
    Mais je ne comprends pas ta reponse. Si je peux creer une cle primaire a partir de deux champs de la même table, c'est que d'une certaine facon j'ai deux cles primaire (on ne joue que sur les mots ). Mais dans ce cas j'aimerais bien savoir comment on fait pour créer une clé primaire à partir de deux champs d'une table.
    Si tu as un exemple de requete SQL, je suis preneur
    Merci

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 349
    Par défaut
    Non non je ne joue pas sur les mots...

    Si tu constitues une clé primaire à partir de deux champs, c'est le couple des deux clés qui devra être unique, pas chaque clé individuellement.

    Voici un exmple de table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE [Events] (
    [Carrier] INTEGER  NOT NULL,
    [Date] TIMESTAMP  NOT NULL,
    [Type] INTEGER  NOT NULL,
    [Status] INTEGER  NOT NULL,
    [Comment] TEXT  NULL,
    PRIMARY KEY ([Carrier],[Date])
    );
    Comme tu peux le voir, la clé primaire est constituée des champs Carrier et Date.

    ++

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 349
    Par défaut
    Sinon tu peux aussi mettre un de tes deux champs en clé primaire, et l'autre en "UNIQUE".

    ++

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 9
    Par défaut
    Citation Envoyé par SesechXP
    Non non je ne joue pas sur les mots...

    Si tu constitues une clé primaire à partir de deux champs, c'est le couple des deux clés qui devra être unique, pas chaque clé individuellement.

    Voici un exmple de table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE [Events] (
    [Carrier] INTEGER  NOT NULL,
    [Date] TIMESTAMP  NOT NULL,
    [Type] INTEGER  NOT NULL,
    [Status] INTEGER  NOT NULL,
    [Comment] TEXT  NULL,
    PRIMARY KEY ([Carrier],[Date])
    );
    Comme tu peux le voir, la clé primaire est constituée des champs Carrier et Date.

    ++

    je suis d'accord avec toi.
    mais je veux en plus, qu'une de ces cles soit en AUTOINCREMENT.
    et là je me retrouve avec un refus.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 349
    Par défaut
    Quand tu mets une clé en autoincrement, elle est également considérée comme clé primaire. Et comme tu as sans doute défini une autre clé primaire, SQLite refuse...

    Tu ne peux avoir qu'une seule et unique clé primaire dans une table, sinon ce n'est plus une clé primaire

    ++

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 9
    Par défaut
    Citation Envoyé par SesechXP
    Quand tu mets une clé en autoincrement, elle est également considérée comme clé primaire. Et comme tu as sans doute défini une autre clé primaire, SQLite refuse...

    Tu ne peux avoir qu'une seule et unique clé primaire dans une table, sinon ce n'est plus une clé primaire

    ++
    Je sais bien qu'on ne peut avoir qu'une seul clé primaire.
    Mais il est possible de définir un couple de champs (meme plus si on veut) comme cle primaire avec un en autoincrement. C'est une chose courante, qui fonctionne avec d'autre SGBD (mysql par exemple) mais qui ne semble pas fonctionner avec SQLite

  9. #9
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Décembre 2005
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2005
    Messages : 110
    Par défaut
    C'est très probable que ça ne fonctionne pas avec SQLite. Je n'ai jamais essayé. Je dis ça parce que le type AUTO INCREMENT n'existe pas réellement sous SQLite. Il est implicite. C'est-à-dire que pour mettre un champ en autoincrement, il faut lui affecter le type INTEGER conjointement avec le mot clé PRIMARY KEY. Le mot clé AUTO INCREMENT n'existe pas.

    Pour déclarer une clé primaire "double", il faut faire PRIMARY KEY(champ1, champ2), comme indiqué plus haut, tu comprendras donc qu'il ne peut pas y avoir de champ auto increment dans une clé double avec SQLite , car cela reviendrait à déclarer 2 fois une clé primaire, comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TABLE [Events] (
    [Carrier] INTEGER  PRIMARY KEY, -----> pour l'auto-increment
    [Date] TIMESTAMP  NOT NULL,
    [Type] INTEGER  NOT NULL,
    [Status] INTEGER  NOT NULL,
    [Comment] TEXT  NULL,
    PRIMARY KEY ([Carrier],[Date])
    );
    Le champ Carrier se voit affecter 2 fois le statut de clé primaire... Ceci dit tu peux toujours essayer... Qui ne tente rien n'a rien !
    Par contre je crois qu'il ne faut pas mettre de contrainte 'NOT NULL' car pour que l'auto-increment fonctionne, il faut mettre 'null' dans la requête d'insertion de données.

    --> Le site officiel pour plus de détails

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 9
    Par défaut
    Citation Envoyé par fadeninev
    C'est très probable que ça ne fonctionne pas avec SQLite. Je n'ai jamais essayé. Je dis ça parce que le type AUTO INCREMENT n'existe pas réellement sous SQLite. Il est implicite. C'est-à-dire que pour mettre un champ en autoincrement, il faut lui affecter le type INTEGER conjointement avec le mot clé PRIMARY KEY. Le mot clé AUTO INCREMENT n'existe pas.
    En revanche sur ce point je ne suis pas d'accord avec toi. Le mot clé AUTOINCREMENT existe bien : http://www.sqlite.org/lang_createtable.html.


    Citation Envoyé par fadeninev
    Pour déclarer une clé primaire "double", il faut faire PRIMARY KEY(champ1, champ2), comme indiqué plus haut, tu comprendras donc qu'il ne peut pas y avoir de champ auto increment dans une clé double avec SQLite , car cela reviendrait à déclarer 2 fois une clé primaire, comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TABLE [Events] (
    [Carrier] INTEGER  PRIMARY KEY NOT NULL, -----> pour l'auto-increment
    [Date] TIMESTAMP  NOT NULL,
    [Type] INTEGER  NOT NULL,
    [Status] INTEGER  NOT NULL,
    [Comment] TEXT  NULL,
    PRIMARY KEY ([Carrier],[Date])
    );
    Le champ Carrier se voit affecter 2 fois le statut de clé primaire... Ceci dit tu peux toujours essayer... Qui ne tente rien n'a rien !

    --> Le site officiel pour plus de détails
    Mais effectivement c'est impossible de faire ce que je veux. Ca m'oblige à renoncer à utiliser SQLite et je trouve cela bien dommage

  11. #11
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Décembre 2005
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2005
    Messages : 110
    Par défaut
    Bon courage

  12. #12
    Membre éclairé Avatar de psycho_38
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 55
    Par défaut
    Pourquoi renoncé a Sqllite ta qu'a gérer l'auto incrémentation tout seul.
    OK c'est pas très propre mais bon,c'est toujours ca

    O fait tu l utilise avec quel langage ??

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 9
    Par défaut
    Citation Envoyé par psycho_38
    Pourquoi renoncé a Sqllite ta qu'a gérer l'auto incrémentation tout seul.
    OK c'est pas très propre mais bon,c'est toujours ca

    O fait tu l utilise avec quel langage ??
    Une auto-incrementation fait par soi même posera des problèmes de concurrence.

    Je l'utilise pour l'instant avec MySQL

  14. #14
    Membre éclairé Avatar de psycho_38
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 55
    Par défaut
    non pas forcément

    si tu le fai correctement yaura pas de probleme de concurrence

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 9
    Par défaut
    Citation Envoyé par psycho_38
    non pas forcément

    si tu le fai correctement yaura pas de probleme de concurrence
    Beh alors justement, c'est comment correctement?

  16. #16
    Membre éclairé Avatar de psycho_38
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 55
    Par défaut
    tu fais une requete Sql qui recupere ton id le plus grand (select Max('ton_id') from nomtable)tu l' affecte à une variable
    Puis lorque tu insert ton nouvel enregistrement tu affecte + 1 a cette variable et logiquement tu n'aura aucun doublon

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 9
    Par défaut
    Citation Envoyé par psycho_38
    tu fais une requete Sql qui recupere ton id le plus grand (select Max('ton_id') from nomtable)tu l' affecte à une variable
    Puis lorque tu insert ton nouvel enregistrement tu affecte + 1 a cette variable et logiquement tu n'aura aucun doublon
    Oui et qu'est ce qui me garantis que deux processus n'essayent pas de faire cette même opération en même temps et donc d'obtenir le même numéro?
    Apres avoir regardé la doc, il faudrait utiliser un BEGIN EXCLUSIVE.
    Mais je me demande si ce n'est pas exagéré? (Je n'ai pas d'avis là dessus).

  18. #18
    Membre éclairé Avatar de psycho_38
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 55
    Par défaut
    Que sous entend tu par deux processus ?

    Si tu veux gerer le faite que deux personnes puisse inserer au même moment un tuple, pourquoi serait il exagérer de mettre en place une transaction exclusive ?

    A mon avis c'est une bonne solution a ton probleme, car ca te permeterai de ne pas abandonner sqlite

  19. #19
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 9
    Par défaut
    Citation Envoyé par psycho_38
    Que sous entend tu par deux processus ?

    Si tu veux gerer le faite que deux personnes puisse inserer au même moment un tuple, pourquoi serait il exagérer de mettre en place une transaction exclusive ?

    A mon avis c'est une bonne solution a ton probleme, car ca te permeterai de ne pas abandonner sqlite
    Oui vu sous cet angle, c'est vrai que c'est un bon point.
    En tout cas merci à toi car je n'aurais pas cherché plus loin même si je n'aime toujours pas cette methode du SELECT MAX....INSERT qui mal utilisé est tres mauvais et tres laid en fait

Discussions similaires

  1. mapper table cle primaire double
    Par dominou73 dans le forum Hibernate
    Réponses: 6
    Dernier message: 15/10/2007, 07h11
  2. Requête sur table à double clés primaires
    Par darkian dans le forum Langage SQL
    Réponses: 4
    Dernier message: 04/03/2005, 17h28
  3. [debutant]cle primaire particuliere
    Par christophebmx dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 21/08/2004, 13h27
  4. [ db2 ] cle primaire autoincrement
    Par hocinema dans le forum DB2
    Réponses: 4
    Dernier message: 25/02/2004, 14h20
  5. XSD, Cle primaire...
    Par Goupil dans le forum Valider
    Réponses: 3
    Dernier message: 21/10/2003, 09h04

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