#1 Fri 26 June 2015 10:53
- lrenee
- Participant occasionnel
- Date d'inscription: 4 Dec 2013
- Messages: 22
Erreur clé primaire PostgreSQL 9.3
Bonjour à tous,
j’essaie de mettre à jour une table prélèvement d'eau en insérant les données d'une autre table mais l'erreur 23505 est renvoyée.
En me renseignant, j'ai lu que cela correspondait à une erreur de clé primaire. Mais après de nombreuses vérifications, je suis sûre qu'il n'y a pas de doublons pour le champ PK .
C'est une manipulation que je suis amenée à faire plusieurs fois par an, et qui ne me pose normalement pas de problème.
Pour info, le code :
Code:
INSERT INTO t_prelevement ('prel_code','prel_numero_station','prel_date_debut','prel_heure_debut') SELECT DISTINCT prel_code, prel_numero_station, prel_date_debut, prel_heure_debut FROM integ_exposur_pc;
En sachant que la clé primaire est le champ 'prel_code'
Hors ligne
#3 Fri 26 June 2015 12:10
- lrenee
- Participant occasionnel
- Date d'inscription: 4 Dec 2013
- Messages: 22
Re: Erreur clé primaire PostgreSQL 9.3
Bonjour,
non elle n'est pas vide.
Hors ligne
#4 Fri 26 June 2015 13:01
- Nicolas Granier
- Participant assidu
- Date d'inscription: 19 Apr 2007
- Messages: 271
Re: Erreur clé primaire PostgreSQL 9.3
Bonjour,
en suivant le résonnement de Jean-Marie
quel est le résultat de cette requete ?
Code:
select prel_code from t_prelevement where prel_code in (select prel_code from integ_exposur_pc)
SI vous avez un résultat c'est que vous avez déjà ce code dans la table t_prélevement
Vous pouvez aussi essayer de créer une nouvelle table avec la commande
Code:
create table exemple as select prel_code,...
puis ensuite de rajouter la contrainte de clé primaire sur le champ prel_code
Dernière suggestion
Je ne suis pas sur que les quotes ( ' ) soient indispensables. Normalement elles servent à entourer des valeurs de type texte comme le contenu d'un champ; pour faire référence à un champ on utilise normalement des doubles quotes ( " ). Dans votre cas je ne mettrai aucune quote.
Code:
INSERT INTO t_prelevement (prel_code,prel_numero_station,...
Hors ligne
#5 Fri 26 June 2015 14:04
- lrenee
- Participant occasionnel
- Date d'inscription: 4 Dec 2013
- Messages: 22
Re: Erreur clé primaire PostgreSQL 9.3
Bonjour Nicolas et merci.
Concernant la première proposition, le résultat de la requête est vide, c'est qu'il n'y a, en effet, pas de doublons.
Concernant la troisième suggestion, j'ai suivi votre conseil et ai enlevé les quotes mais rien n'a changé.
Par contre, je ne pense pas comprendre votre seconde suggestion.
La table integ_exposur_pc ne contient pas de PK car il y a une ligne pour un paramètre de qualité de l'eau auquel est associé un champ date, un champ code_station et un champ code_prelevement. Du coup, le code prélèvement est répété tant que la date et le code station sont identiques.
Il ne serait donc pas possible de créer une table test et ensuite d'y affecter la contrainte de clé primaire ?
Hors ligne
#6 Fri 26 June 2015 15:56
- Nicolas Granier
- Participant assidu
- Date d'inscription: 19 Apr 2007
- Messages: 271
Re: Erreur clé primaire PostgreSQL 9.3
Je crois comprendre...
Vous avez des doublons sur le champ prel_code dans la table integ_exposur_pc. Forcément vous ne pouvez pas intégrer ces données là directement dans l'autre table à cause de la clé primaire sur prel_code. Pour remédier à ceci vous avez fait un distinct , c'est cela ?
Dernière modification par Nicolas Granier (Fri 26 June 2015 15:57)
Hors ligne
#7 Fri 26 June 2015 16:08
- lrenee
- Participant occasionnel
- Date d'inscription: 4 Dec 2013
- Messages: 22
Re: Erreur clé primaire PostgreSQL 9.3
oui, c'est bien ça.
Par contre je viens de découvrir qu'il y avait des problèmes de remplissage de cellule de la colonne heure au départ, il considérait donc qu'il y avait des doublons lors de l'intégration dans prel_code (ce qui est compréhensible).
Bref, j'ai remédié à cela et nouvelle erreur 23503 : violation de clé étrangère. Là, je n'y comprends plus rien. J'ai aucun champ déclaré en clé étrangère.
Hors ligne
#8 Fri 26 June 2015 16:25
- Nicolas Granier
- Participant assidu
- Date d'inscription: 19 Apr 2007
- Messages: 271
Re: Erreur clé primaire PostgreSQL 9.3
je pense que le problème vient du distinct. C'est une commande à bannir.
Pour reprendre les choses depuis le début.
Vous devez intégrer dans une table avec une clé primaire sur le champ prel_code, des données d'une autre table avec des doublons sur le champ prel_code.
Il vous faut donc regrouper les données => avec l'opérateur group by
, et pour les champs à mettre dans le select à par prel_code, il vous faudra faire utiliser des opérateurs d’agrégats (min, max, count,...)
Il vous faut une requête propre, pour être sure que les erreurs qui surviennent ne sont pas produites et trainées par le distinct.
Hors ligne
#9 Mon 29 June 2015 10:51
- lrenee
- Participant occasionnel
- Date d'inscription: 4 Dec 2013
- Messages: 22
Re: Erreur clé primaire PostgreSQL 9.3
Bonjour,
Finalement j'ai trouvé le problème. Et, il était de ma faute.
Le problème de clé étrangère venait du fait que le champs code_station est lié à une table (t_station) et que certain codes ne figuraient pas dans cette table (tout simplement).
il faut être très minutieux dans les bases de données, et plus il y a d'informations, moins il est facile de trouver d'où vient l'erreur (surtout avec PostGre qui ne donne pas beaucoup d'informations).
Bref, problème résolu.
Hors ligne
#10 Mon 29 June 2015 12:30
Re: Erreur clé primaire PostgreSQL 9.3
Bonjour,
Respecter (ou s'inspirer) de la convention de nommage de Ruby On Rails simplifie pas mal l'identification des données :
Table :
les noms de table sont tous en minuscules avec des underscores entre les mots, ils sont au pluriel, ex: services, personne_techniques, commandes, produits
Clé primaire :
La clé primaire d'une table est supposée s'appeler id
Clé étrangère :
Une clé étrangère est nommée avec le nom de la table référencée, au singulier, auquel on ajoute _id
ex: service_id pour référencer un enregistrement de la table services
Table de jointure :
Une table utilisée pour établir une jointure entre deux tables dans une relation N à N est nommée avec les deux noms de tables dans l'ordre alphabétique. Ex: commandes_produits
Horodatage d'enregistrement :
Les colonnes d'horodatage sont nommées
created_on, updated_on pour la date de création ou mise à jour
created_at, updated_at pour la date et l'heure de création ou mise à jour
Jean-Marie
Azimut
Hors ligne