Précédent   Forum des professionnels en informatique > Bases de données > Autres SGBD > SQLite
SQLite Forum d'entraide SQLite
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/11/2006, 16h12   #1
Invité de passage
 
Inscription : novembre 2006
Messages : 9
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 9
Points : 0
Points : 0
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
la_loutre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2006, 11h02   #2
Membre confirmé
 
Inscription : avril 2006
Messages : 342
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : avril 2006
Messages : 342
Points : 273
Points : 273
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.

++
__________________
Le problème est souvent entre la chaise et le clavier
SesechXP est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2006, 11h43   #3
Invité de passage
 
Inscription : novembre 2006
Messages : 9
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 9
Points : 0
Points : 0
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
la_loutre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2006, 11h50   #4
Membre confirmé
 
Inscription : avril 2006
Messages : 342
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : avril 2006
Messages : 342
Points : 273
Points : 273
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 :
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.

++
__________________
Le problème est souvent entre la chaise et le clavier
SesechXP est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2006, 11h51   #5
Membre confirmé
 
Inscription : avril 2006
Messages : 342
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : avril 2006
Messages : 342
Points : 273
Points : 273
Sinon tu peux aussi mettre un de tes deux champs en clé primaire, et l'autre en "UNIQUE".

++
__________________
Le problème est souvent entre la chaise et le clavier
SesechXP est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2006, 12h27   #6
Invité de passage
 
Inscription : novembre 2006
Messages : 9
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 9
Points : 0
Points : 0
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 :
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.
la_loutre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2006, 13h36   #7
Membre confirmé
 
Inscription : avril 2006
Messages : 342
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : avril 2006
Messages : 342
Points : 273
Points : 273
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

++
__________________
Le problème est souvent entre la chaise et le clavier
SesechXP est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2006, 13h45   #8
Invité de passage
 
Inscription : novembre 2006
Messages : 9
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 9
Points : 0
Points : 0
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
la_loutre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2006, 15h07   #9
Membre du Club
 
Développeur Web
Inscription : décembre 2005
Messages : 110
Détails du profil
Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : décembre 2005
Messages : 110
Points : 45
Points : 45
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 :
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
fadeninev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2006, 15h57   #10
Invité de passage
 
Inscription : novembre 2006
Messages : 9
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 9
Points : 0
Points : 0
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 :
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
la_loutre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2006, 20h50   #11
Membre du Club
 
Développeur Web
Inscription : décembre 2005
Messages : 110
Détails du profil
Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : décembre 2005
Messages : 110
Points : 45
Points : 45
Bon courage
fadeninev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2007, 21h53   #12
Membre du Club
 
Avatar de psycho_38
 
Inscription : novembre 2006
Messages : 55
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 55
Points : 51
Points : 51
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 ??
psycho_38 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2007, 22h23   #13
Invité de passage
 
Inscription : novembre 2006
Messages : 9
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 9
Points : 0
Points : 0
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
la_loutre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2007, 22h31   #14
Membre du Club
 
Avatar de psycho_38
 
Inscription : novembre 2006
Messages : 55
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 55
Points : 51
Points : 51
non pas forcément

si tu le fai correctement yaura pas de probleme de concurrence
psycho_38 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2007, 10h31   #15
Invité de passage
 
Inscription : novembre 2006
Messages : 9
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 9
Points : 0
Points : 0
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?
la_loutre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2007, 11h40   #16
Membre du Club
 
Avatar de psycho_38
 
Inscription : novembre 2006
Messages : 55
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 55
Points : 51
Points : 51
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
psycho_38 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2007, 12h33   #17
Invité de passage
 
Inscription : novembre 2006
Messages : 9
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 9
Points : 0
Points : 0
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).
la_loutre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2007, 12h44   #18
Membre du Club
 
Avatar de psycho_38
 
Inscription : novembre 2006
Messages : 55
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 55
Points : 51
Points : 51
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
psycho_38 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2007, 13h18   #19
Invité de passage
 
Inscription : novembre 2006
Messages : 9
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 9
Points : 0
Points : 0
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
la_loutre est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h28.


 
 
 
 
Partenaires

Hébergement Web