PostgreSQL
La base de données la plus sophistiquée au monde.

Ouverture de session

Navigation

Contactez-nous

Administration du site :
"equipe chez postgresqlfr point org"

Contact presse :
"fr chez postgresql point org"

Contact association :
"bureau chez postgresqlfr point org"

Questions PostgreSQL :
 IRC :
  serveur irc.freenode.net
  canal #postgresqlfr

Recherche

Accéder aux archives

« Octobre 2008  
Lun Mar Mer Jeu Ven Sam Dim
  2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31  

Syndication

Flux XML

Sondage

Quelle est la version de PostgreSQL la plus répandue sur vos serveurs ?
8.3
10%
8.2
42%
8.1
40%
8.0
2%
7.4
6%
7.3 ou antérieure
0%
Nombre de votes: 48

commande COPY + gestion des valeurs SERIAL

Technique - général | commande COPY + gestion des valeurs SERIAL

Par ee_lars le 21/04/2008 - 11:29

Bonjour,

J'utilise un script SHELL pour faire des exports imports depuis une base de données ORACLE vers un base de données POSTGRESQL (V8.2) :
Le script commence par lancer les requêtes sur la base ORACLE et chaque résultat est stocké dans un fichier de spool, j'ai donc une dizaine de fichiers contenant des valeurs du genre :
blabla:toto:546
blibli:tata:321

Ensuite, une boucle insère les données de chaque fichier dans la table voulue.

Chacune des tables de la base POSTGRESQL a un champ SERIAL en clé primaire : je voudrais savoir s'il est possible, au moment de l'insertion par COPY, d'auto-incrémenter les valeurs de ces clés...

Merci d'avance pour votre réponse.

Options d'affichage des commentaires

Sélectionnez la méthode d'affichage des commentaires que vous préférez, puis cliquez sur "Sauvegarder les paramètres" pour activer vos changements.

Copy et autoincrément

SAS/ = 22 Avril, 2008 - 23:10

Bonsoir,

Vous pouvez utiliser la magie des autoincréments dans les opérations de Copy.

Vous pouvez, par exemple, préciser les champs à copier, en omettant le champ serial :


create matable(
id serial,
champ2 text,
champ3 text);

COPY matable(champ2, champ3) from stdin;
blabla;toto
bibli;titi
\.

Cela incrémentera la séquence.

Librement,
Stéphane Schildknecht
Dalibo
PostgreSQLFr


oui j'y avait pensé mais le

ee_lars/ = 23 Avril, 2008 - 08:29

oui j'y avait pensé mais le problème est que j'utilise une boucle dans mon script shell, qui scrute dans un simple fichier texte les tables à importer :
for ligne in $(cat $SQL/tables.txt); do
psql -d $BASE -U $USERPG -c "COPY $TABLE FROM $FICEXP/extraction_$TABLE.txt' WITH DELIMITER ':';"
done

Dans ce cas, il semble assez difficile d'indiquer les champs dans le COPY...
Je pensais que COPY pouvait interpreter les SERIAL directement (sans avoir à spécifier les champs à importer...) y-a-t'il un moyen commode de le faire???

Merci pour votre réponse en tout cas.


Autre méthode

SAS/ = 23 Avril, 2008 - 10:07

Bonjour,

Copy ne va pas savoir déterminer quelle colonne manque dans la ligne, et sortira en erreur.

La colonne serial est-elle dans le ficheir csv ?

Si oui, on peut mettre à jour la valeur de la colonne après insertion.

Si non, peut-être pourriez-vous créer la colonne après insertion des données ?

Librement,
Stéphane Schildknecht
Dalibo
PostgreSQLFr


Non elle ne l'est pas... A l

ee_lars/ = 23 Avril, 2008 - 14:12

Non elle ne l'est pas...
A la limite, je peux importer la clé primaire de la table ORACLE (auquel cas l'autoincrément du SERIAL ne me sert à rien).

Vous parlez de créer la colonne après insertion dans le fichier CSV???


Non

SAS/ = 23 Avril, 2008 - 16:00

Si vous récupérez la clé depuis Oracle, le serial pourra servir pour les insertions ultérieures.

Je pensais à créer la colonne de clé primaire après l'insertion des données dans la base (donc, une fois le copy effectué).

En fait, j'émets des hypothèses sans connaître ni votre besoin ni le fonctionnement actuel.

Librement,
Stéphane Schildknecht
Dalibo
PostgreSQLFr


Désolé pour le manque d'inf

ee_lars/ = 24 Avril, 2008 - 11:19

Désolé pour le manque d'information :
Il s'agit en fait d'une application web qui liste des relevés de consommation concernant des services divers.
Les informations de consommation proviennent d'une base de données ORACLE d'un applicatif propriétaire.

Nous devons donc extraire les une partie des information de la base dans une base POSTGRESQL.
L'applicatif étant en PHP, nous avons commencé par faire le transfert via des scripts PHP (avec l'extension OCI8), mais, au vue des opérations effectuées, un script shell va être beaucoup plus simple à mettre en place, à maintenir et va surtout être plus rapide...

C'est un apprenti qui avait écrit la structure de la base de données POSTGRESQL ainsi que les scripts de Transfert PHP.

Tous les jours, les tables voulues sont vidées et les données provenant d'ORACLE sont inserées intégralement (donc il n'y a pas de rajouts manuels dans les tables).

Pour certaines tables, la clé primaire de la base ORACLE est insérée, dans d'autres non, auquel cas une nouvelle clé primaire est créee

D'où ma question de départ sur les SERIAL...
Je me dis à présent que nous devons repointer les tables une par une pour voir s'il est possible d'importer la clé primaire d'ORACLE, ce qui simplifierai la démarche...

Merci pour votre aide


Tant qu'à scripter

SAS/ = 25 Avril, 2008 - 08:47

Bonjour,

Si vous en êtes à réécrire les scripts, rien ne vous empêche de les repenser :-)

Librement,
Stéphane Schildknecht
Dalibo
PostgreSQLFr


Oui tout à fait, après rée

ee_lars/ = 25 Avril, 2008 - 14:52

Oui tout à fait, après réecriture, le script fonctionne parfaitement :)
J'ai juste eu des problèmes au niveau du séparateur utilisé par COPY : il ne peut contenir qu'un caractère, ce qui peut être génant quand on a à traiter des centaines de milliers d'insertions... dans mon cas le '~' s'est avéré efficace :)

Merci


© PostgreSQLFr, tous droits réservés.
Site déclaré à la CNIL sous le numéro 1074678, conformément à la Loi en vigueur.