banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#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

 

#2 Fri 26 June 2015 11:38

jmarsac
Participant assidu
Lieu: NICE
Date d'inscription: 26 Oct 2005
Messages: 572
Site web

Re: Erreur clé primaire PostgreSQL 9.3

La table t_prelevement est-elle vide au lancement de la requête ?

Dernière modification par jmarsac (Fri 26 June 2015 11:39)


Jean-Marie
Azimut

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

jmarsac
Participant assidu
Lieu: NICE
Date d'inscription: 26 Oct 2005
Messages: 572
Site web

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

 

Pied de page des forums

Powered by FluxBB