Vous n'êtes pas identifié(e).

#1 Re : Général » Remplir un champ par numérotation automatique » 21/03/2011 17:16:44

Marc Cousin a écrit :

Attention tout de même à un point: l'ordre des colonnes dans une table ne doit avoir aucune importance dans le développement de l'application (je vous dis ça parce que ça a l'air d'avoir une importance pour vous).

Il faut absolument éviter que l'ordre de définition des colonnes ait la moindre incidence sur le fonctionnement de l'application. Ça veut entre autres dire qu'il faut éviter les 'SELECT *' dans le code, et toujours préférer nommer explicitement la liste des colonnes à récupérer.

SQLpro a écrit :

Par nature dans le SGBDR il n'y a aucune notion d'ordre.

Merci pour vos commentaires.

Il est vrai que ma logique sur ce point n'est pas très bonne (et en général j'aime assez les 'SELECT *' ...)

Mais ? L'ordre des champs a tout de même de l'importance quand on importe des données issues de tableurs ?? (ou pas?!)

--
Elodie

#2 Re : Général » Remplir un champ par numérotation automatique » 10/03/2011 21:19:13

Un grand merci à vous deux.

je vais opter pour la solution où le champ id_test sera en 1ère position dans la table.

Et comme dans quelques temps j'aurai besoin de rajouter d'autres lignes dans ma table à partir d'autres .csv, je pourrai alors faire :

DROP TABLE IF EXISTS testserial;
CREATE TABLE testserial (
     id_test serial,	
     champ1 varchar (10) );

COPY testserial(champ1) FROM 'C:/import_data/testserial.csv' WITH DELIMITER AS ';' CSV HEADER; 
COPY testserial(champ1) FROM 'C:/import_data/testserial2.csv' WITH DELIMITER AS ';' CSV HEADER; 
COPY testserial(champ1) FROM 'C:/import_data/testserial3.csv' WITH DELIMITER AS ';' CSV HEADER; 
-- etc.

Ainsi ma clé primaire id_test sera bien numérotée.

(Sauf que mes tables ont plutot une cinquantaine de champs donc la parenthèse sera longue)

(...)

Je viens de faire un test avec mes grosses tables, ça fonctionne bien.

Encore merci !

#3 Re : Général » Remplir un champ par numérotation automatique » 10/03/2011 15:16:20

gleu a écrit :

Il serait plus simple de nous indiquer l'exemple complet qui ne fonctionne pas pour qu'on puisse vous aider.

En effet.

J'ai donc pris un exemple pour tester mes requêtes.

Voici la table testserial, un seul champ :

champ1
____
valeur1
valeur2
valeur3
valeur4
valeur5
valeur6

DROP TABLE IF EXISTS testserial;
CREATE TABLE testserial (
     champ1 varchar (10) );
	 
COPY testserial FROM 'C:/import_data/testserial.csv' WITH DELIMITER AS ';' CSV HEADER;

ALTER TABLE  testserial ADD COLUMN id_test SERIAL; -- chercher comment placer ce champ en 1ère position dans la table

--Si id_test déclaré en INTEGER :
--DROP SEQUENCE IF EXISTS ma_seq CASCADE;
--CREATE SEQUENCE ma_seq START WITH 7;
--ALTER TABLE testserial ALTER COLUMN id_test SET DEFAULT nextval('ma_seq');
--ALTER SEQUENCE ma_seq OWNED BY obs_pvt.testserial.id_test;

--Si id_test déclaré en SERIAL :
ALTER SEQUENCE testserial_id_test_seq RESTART WITH 6;
ALTER TABLE testserial ALTER COLUMN id_test SET DEFAULT nextval('testserial_id_test_seq');

Mon champ id_test est rempli de 1 à 6 et non de 6 à 11 comme je l'aurais souhaité

#4 Re : Général » Remplir un champ par numérotation automatique » 10/03/2011 14:31:23

Bonjour,

merci pour cette réponse.

Mais en fait je n'ai pas utilisé la commande INSERT...

- Dans ma table j'ai déclaré le champ à remplir a posteriori comme entier INTEGER.
(Je ne le déclare pas en type SERIAL car il ne voudra pas importer mon .csv dont la colonne en question est vide... "ERROR:  null value in column "mon_champ_à_remplir" violates not-null constraint)
- J'ai ensuite importé mes données à partir de mon .csv.
Tout fonctionne.
- J'ai ensuite créé une séquence :

CREATE SEQUENCE ma_seq START 1;

- Puis :

ALTER TABLE ma_table ALTER COLUMN mon_champ_à_remplir SET DEFAULT nextval ('ma_seq');

Après ces commandes, je vois que mon champ est devenu de type SERIAL, mais il reste vide...

Finalement je vais plutôt essayer de rajouter le champ a posteriori, ça devrait simplifier les choses.

... Phase de test ...

(...)

ça fonctionne si je veux que ma numérotation commence par 1.

Mais : si je veux qu'elle démarre à partir de la valeur de la dernière ligne d'un autre table de même format ??!

j'ai essayé en :
1. déclarant mon champ ajouté en integer et créant une séquence avec le paramètre start with puis en indiquant que la valeur par défaut de mon champ est cette séquence ;

2. déclarant mon champ ajouté en serial et en essayant de modifier a posteriori la séquence créée par défaut avec un paramètre restart puis en indiquant que la valeur par défaut de mon champ est cette séquence modifiée.

J'y arrive toujours pas.

Si quelqu'un a une idée...

Merci smile

#5 Général » Remplir un champ par numérotation automatique » 08/03/2011 22:44:03

ElodieS
Réponses : 17

Bonjour à tous,

Je vous expose mon "problème":

j'ai une table que j'importe dans un schéma de ma base sans soucis (à partir d'un fichier csv). Plusieurs champs de cette table sont vides mais c'est tout à fait normal.
Je cherche à remplir un de ces champs vides par une numérotation automatique (de 1 jusqu'au nombre total de lignes).

J'ai cherché parmi les pistes "création d'une SEQUENCE", "type SERIAL" etc. mais je n'y arrive pas.
Ça ne renvoie pas d'erreur, mais mon champ reste toujours vide. Donc j'ai sûrement du rater une étape...

Merci d'avance pour votre aide.

Pied de page des forums

Propulsé par FluxBB