Vous n'êtes pas identifié(e).
Pages : 1
Bonjour,
Je suis nouveau sur ce site. J'ai cherché une réponse à mon problème en utilisant le moteur de recherche mais il n'a rien trouvé.
Je me permet donc de vous poser la question :
J'utilise depuis peu postgresql et pour m'entraîner, je voudrais créer une table avec le nom des villes françaises, leur code postal et leur numéro insee. J'ai récupéré le fichier "officiel" sur data.gouv.fr où il y a un fichier .cvs qui contient toutes ces données. J'ai fait un petit programme en C. Il fonctionne très bien sur les 9742 premières lignes. Pour la 9743ième insertion, le programme s'arrête avec un message d'erreur sur la syntaxe du code postale (en l'occurrence 5700 pour la ville villebois les pins). J'ai essayé de faire cette insertion manuellement via PGadmin3 et j'ai une erreur SQL 23505. En regardant la doc, je trouve que cela correspond à unique_violation. J'ai plusieurs villes qui ont ce code postal et le programme les a bien inséré correctement dans la base, sans erreur ?? Je ne comprend pas trop ce que cela veut dire ?
Quelqu'un a-t'il une idée ?
D'avance merci.
Hors ligne
Il faudrait déjà savoir quelle erreur vous avez. Vous commencez par parler d'une erreur de syntaxe du code postal, puis d'une violation d'une contrainte unique. Quelle est la requête exécutée ? Quelle est l'erreur récupérée ?
Guillaume.
Hors ligne
Bonjour,
Pouvez-vous préciser le schéma de la table ?
Stéphane Schildknecht
Conseil, formations et support PostgreSQL
http://www.loxodata.com
Hors ligne
Bonjour,
Effectivement je n'ai pas été très précis.
Alors voila, ma base a la structure suivante :
-- Table: cpvilles
-- DROP TABLE cpvilles;
CREATE TABLE cpvilles
(
"IdVille" integer NOT NULL, -- Clé sur la ville
"NomVille" character(50),
"CP" integer,
"INSEE" integer,
CONSTRAINT "idVille" PRIMARY KEY ("IdVille")
)
WITH (
OIDS=FALSE
);
ALTER TABLE cpvilles
OWNER TO postgres;
COMMENT ON TABLE cpvilles
IS 'Table des codes postaux et des villes';
COMMENT ON COLUMN cpvilles."IdVille" IS 'Clé sur la ville';
Ensuite pour ce qui est des erreurs :
avec mon programme, sur la console j'ai :
"
INSEE : 26734
Code postale : 5700
ville : VILLEBOIS LES PINS
echec de la commande INSERT : ERREUR: syntaxe en entrée invalide pour l'entier : 1/2 5700
"
Quand je passe en manuel sur PGadmin3, je rentre le insert into avec lea paramètres et j'ai un retour en SQL 23505
Je vais reprendre le code dans son ensemble ce soir.
Si vous avez des idées, merci beaucoup.
Hors ligne
Re-bonjour,
Il manque des informations dans votre rapport.
Et votre schéma n'est pas correct.
Je vous conseille d'éviter fortement les majuscules dans les noms de tables et de champs. Elles n'apportent que complexité et ennui.
Pouvez-vous donner un exemple de ligne CSV ?
Importez-vous le CSV tel qu'il est, ou le traitez-vous avec votre programme ?
CP n'est pas un integer, mais plutôt une chaîne de caractères, de 5 caractères. Avec un entier, toutes les villes comprises dans les départements 01 à 09 n'auront que 4 chiffres sur le code postal. Ce qui n'est pas satisfaisant.
Avez-vous la certitude que 50 est la limite de longueur des noms de ville ?
"syntaxe en entrée invalide pour l'entier : 1/2 5700" <-- Il y a 1/2 dans le CSV ?
Dernière modification par SAS (14/09/2015 15:18:56)
Stéphane Schildknecht
Conseil, formations et support PostgreSQL
http://www.loxodata.com
Hors ligne
je confirme pour le code postal, c'est une chaine de caractères : pensez aux corses (2A,2B) !!!
sinon, comme le dit SAS, vous avez un problème dans votre CSV, "1/2 5700" ne ressemble pas trop à un code postal.
Hors ligne
Merci pour vos réposnes.
je remplace toutes les majuscules par des minuscules.
Le fichier .csv est un fichier tableur type excel. La syntaxe de celui que j'utilise est :"insee; nom ville ; code postal; réacheminement(\LF\CR)"
le réacheminement est une chaîne de caractère qui ne m'intéresse pas donc je passe à la ligne à la fin du code postal.
Mon programme en C lit le fichier, récupère insee, nom ville et code postal puis les insère dans la table.
Ca fonctionne très bien pour les premières lignes, aucun pb. Par contre j'ai du mal à comprendre pourquoi ça bug à la ligne 9743 ?
Dans le fichier .cvs, cette ligne est : "26734; VILLEBOIS LES PINS ; 5700; VILLEBOIS LES PINS"
Toutes les chaines de caractères font moins de 50 caractères c'est certain. Avant de lancer l'insertion dans la table, j'ai fait un certains nombres de test sur le fichiers .cvs pour déterminer la longueur max de chacune des chaines et pour déterminer le nombre de lignes.
pour ce qui est du 1/2 je crois que c'est un problème d'encodage. Ma console est en ISO 8852-1 et je pense que ça vient de là (peut être une erreur de transcription de guillement ?).
Par contre effectivement, vous avez raison, il faudrait que je mette des chaînes de caractères et pas des integer. Je vais corriger.
Je prend en compte toutes vos remarques dès ce soir et je vous tiens au courant.
Encore merci pour votre réactivité.
Hors ligne
Bonsoir,
Bon, après avoir transformé toutes les majuscules en minuscules, CA MARCHE !!
A vrai dire je ne comprend pas pourquoi mais je retiens qu'il ne faut jamais mettre de majuscule quand on utilise postgresql.
Merci à vous.
Hors ligne
Bon, après avoir transformé toutes les majuscules en minuscules, CA MARCHE !!
... je retiens qu'il ne faut jamais mettre de majuscule quand on utilise postgresql.
Bonjour,
Ce n'est pas tout à fait cela.
Il se trouve que PostgreSQL considère des minuscules _par défaut_.
Cela signifie que si vous utilisez des majuscules, il faudra toujours veiller à bien entourer la chaîne de caractères représentant le nom de l'objet de double quotes dans TOUTE référence à l'objet. Dans votre code, dans le SQL...
Cela dit, je ne comprend pas pourquoi l'erreur intervient en plein milieu de l'insertion et non pas dès le début, si ce n'est lié qu'à une mauvaise identification des objets.
Stéphane Schildknecht
Conseil, formations et support PostgreSQL
http://www.loxodata.com
Hors ligne
Merci SAS pour cette précision concernant les Majuscules et les minuscules. Je ferai attention.
Pour le problème que j'ai rencontré, vu que je ne comprenais plus grand chose, j'ai détruit la table puis reconstruite avec uniquement des minuscules.
Ca a fonctionné ? tant mieux.
Dans un deuxième temps, j'ai tenu compte des autres remarques et je n'ai gardé que la clé primaire en integer, le reste a été transformé en chaîne de caractères.
Ca marche toujours.
Encore merci pour vos remarques.
Bonne journée
Hors ligne
Pages : 1