Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/05/2004, 16h05   #1
Invité de passage
 
Inscription : mai 2004
Messages : 7
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 7
Points : 2
Points : 2
Par défaut [Résolu] spécifier NOT NULL - champ existant

Salut, je suis actuellement en train de réaliser un module applicatif utilisant une base PostgreSQL. J'aimerais ajouter quelques champs dans les tables existantes et les spécifier "NOT NULL".

J'ai installé phpPgAdmin pour simplifier les modifications éventuelles de la base et je voulais donc m'en servir pour modifier mes champs. Oui mais voilà, dès que j'en crée un en spécifiant "NOT NULL", phpPgAdmin (ou Postgre) me dit ça :

Code :
1
2
3
4
5
Warning: PostgreSQL query failed: ERROR: Adding NOT NULL COLUMNS IS NOT implemented. ADD the COLUMN, then USE ALTER TABLE ADD CONSTRAINT. IN /usr/share/phppgadmin/tbl_addfield.php ON line 25
Error - /usr/share/phppgadmin/tbl_addfield.php -- Line: 25
PostgreSQL said: ERROR: Adding NOT NULL COLUMNS IS NOT implemented. ADD the COLUMN, then USE ALTER TABLE ADD CONSTRAINT. 
Your query: 
ALTER TABLE "users" ADD "libelleDemande" varchar (32) NOT NULL ;
J'ai essayé de trouver sur le net, sur ce forum et dans la doc Postgre comment ajouter la contrainte NOT NULL sur un champ mais j'ai pô trouvé
J'ai tenté quelques requêtes SQL avec "ALTER TABLE" et "ADD CONSTRAINT" mais ça n'a rien donné de probant

Ai-je mal cherché ? Quelqu'un sait-il comment s'y prendre ?
Autant de questions qui me trottent dans la tête

Merci d'avance pour vos réponses 8)
internet_killer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2004, 16h14   #2
Membre actif
 
Inscription : juin 2003
Messages : 209
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 209
Points : 189
Points : 189
La syntaxe est la suivante:

Code :
1
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
scratch=# \h alter table
Command:     ALTER TABLE
Description: CHANGE the definition of a TABLE
Syntax:
ALTER TABLE [ ONLY ] name [ * ]
    ADD [ COLUMN ] COLUMN type [ column_constraint [ ... ] ]
ALTER TABLE [ ONLY ] name [ * ]
    DROP [ COLUMN ] COLUMN [ RESTRICT | CASCADE ]
ALTER TABLE [ ONLY ] name [ * ]
    ALTER [ COLUMN ] COLUMN { SET DEFAULT expression | DROP DEFAULT }
ALTER TABLE [ ONLY ] name [ * ]
    ALTER [ COLUMN ] COLUMN { SET | DROP } NOT NULL
ALTER TABLE [ ONLY ] name [ * ]
    ALTER [ COLUMN ] COLUMN SET STATISTICS integer
ALTER TABLE [ ONLY ] name [ * ]
    ALTER [ COLUMN ] COLUMN SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }
ALTER TABLE [ ONLY ] name [ * ]
    SET WITHOUT OIDS
ALTER TABLE [ ONLY ] name [ * ]
    RENAME [ COLUMN ] COLUMN TO new_column
ALTER TABLE name
    RENAME TO new_name
ALTER TABLE [ ONLY ] name [ * ]
    ADD table_constraint
ALTER TABLE [ ONLY ] name [ * ]
    DROP CONSTRAINT constraint_name [ RESTRICT | CASCADE ]
ALTER TABLE name
    OWNER TO new_owner
ALTER TABLE name
    CLUSTER ON index_name
Donc pour rajouter une contrainte sur un attribut, tu fais:

Code :
ALTER TABLE table1 ALTER col1 SET NOT NULL;
Mais attention, ton alter fonctionne seulement si tous les enregistrements qui sont dans ta table ne sont pas nulles pour l'attribut col1.
Bouboubou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2004, 16h24   #3
Invité de passage
 
Inscription : mai 2004
Messages : 7
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 7
Points : 2
Points : 2
J'avais déjà tenté cette manip mais en ayant des "NULL" dans ma colonne, je viens de la reessayer après les avoir renseigné :

Code :
ALTER TABLE users ALTER typeuser SET NOT NULL;
Ca m'a donné un message d'erreur :

Code :
1
2
3
PostgreSQL said: ERROR: parser: parse error at OR near "not" 
Your query: 
ALTER TABLE users ALTER typeuser SET NOT NULL
C'est bizarre tout de même
internet_killer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2004, 16h27   #4
Membre actif
 
Inscription : juin 2003
Messages : 209
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 209
Points : 189
Points : 189
Fait un et redonne moi la structure de ta table, stp!

A+
Bouboubou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2004, 16h37   #5
Invité de passage
 
Inscription : mai 2004
Messages : 7
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 7
Points : 2
Points : 2
Malheureusement je n'ai pas accès aux commandes psql à partir de mon poste (stagiaire dans la boite).
Par contre si tu veux la structure de la table, je peux te la fournir :

Code :
1
2
3
4
5
6
7
8
9
CREATE TABLE "users" (
   "userlogin" varchar(32) DEFAULT '' NOT NULL,
   "userpassword" varchar(32) DEFAULT '' NOT NULL,
   "serviceid" int4 DEFAULT '0' NOT NULL,
   "acteurId" int4,
   "typeuser" varchar(2) DEFAULT '',
   CONSTRAINT "users_pkey" PRIMARY KEY ("userlogin")
);
CREATE  UNIQUE INDEX "user_userlogin" ON "users" ("userlogin");
Voilà.

Petite précision tout de même : j'aimerais bien éviter de supprimer la table avec toutes les informations dedans
Ca m'éviterait de faire des export/import, mais si il n'y a que ça comme solution... :o
internet_killer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2004, 16h44   #6
Membre actif
 
Inscription : juin 2003
Messages : 209
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 209
Points : 189
Points : 189
Hello,

Je ne comprend pas trop pourquoi mettre une valeur par défaut de '' (vide)... cela revient à mettre des valeurs nulles, mais avec les désaventage que cela implique...

Quoiqu'il en soit, j'ai créé ta table et j'ai réussi à faire un alter:

Code :
1
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
scratch=# \d users
                             TABLE "public.users"
    COLUMN    |         Type          |               Modifiers
--------------+-----------------------+----------------------------------------
 userlogin    | character varying(32) | NOT NULL DEFAULT ''::character varying
 userpassword | character varying(32) | NOT NULL DEFAULT ''::character varying
 serviceid    | integer               | NOT NULL DEFAULT 0
 acteurId     | integer               |
 typeuser     | character varying(2)  | DEFAULT ''::character varying
Indexes:
    "users_pkey" PRIMARY KEY, btree (userlogin)
    "user_userlogin" UNIQUE, btree (userlogin)
 
scratch=# alter table users alter typeuser set not null;
ALTER TABLE
 
scratch=# \d users
                             TABLE "public.users"
    COLUMN    |         Type          |               Modifiers
--------------+-----------------------+----------------------------------------
 userlogin    | character varying(32) | NOT NULL DEFAULT ''::character varying
 userpassword | character varying(32) | NOT NULL DEFAULT ''::character varying
 serviceid    | integer               | NOT NULL DEFAULT 0
 acteurId     | integer               |
 typeuser     | character varying(2)  | NOT NULL DEFAULT ''::character varying
Indexes:
    "users_pkey" PRIMARY KEY, btree (userlogin)
    "user_userlogin" UNIQUE, btree (userlogin)
Franchement, je ne sais pas quoi te dire... tu travailles avec phpPgAdmin?
Bouboubou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2004, 16h51   #7
Invité de passage
 
Inscription : mai 2004
Messages : 7
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 7
Points : 2
Points : 2
Effectivement c'est strange
Oui je travaille avec phpPgAdmin (bien obligé, j'ai que ça, même pas une console, snif )

Info : oui je sais bien que le coup du "DEFAULT" est con mais j'ai comme instruction de modifier au minimum la structure actuelle

Bon si tu me dis que tu y es arrivé c'est que c'est faisable, je pense que c'est phpPg qui fout la merde
J'irais embêter l'admin pour qu'il me mette une console 8)

Je vais attendre un peu avant de mettre résolu sur mon post au cas où qulqu'un sache si phpPgAdmin est le fautif dans l'histoire .

Merci pour la commande, ça me servira quand même je pense
internet_killer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2004, 14h40   #8
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
phpPgAdmin n'y est pour rien : il n'est pas possible avec PostgreSQL 7.3 de spécifier une contrainte NOT NULL en même temps que la création d'un champ avec ALTER TABLE. Je crois que ca l'est avec la 7.4, mais je suis pô sur...
La seule solution que j'ai trouvée :

1) Créer le champ dans la table :

Code :
ALTER TABLE ta_table ADD COLUMN VARCHAR ton_champ;
2) Ajouter une contrainte à la table :

Code :
ALTER TABLE ta_table ADD CONSTRAINT ta_contrainte CHECK (ton_champ IS NOT NULL)
GrandFather est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2004, 14h43   #9
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
phpPgAdmin n'y est pour rien : il n'est pas possible avec PostgreSQL 7.3 de spécifier une contrainte NOT NULL en même temps que la création d'un champ avec ALTER TABLE. Je crois que ca l'est avec la 7.4, mais je suis pô sur...
Une solution possible :

1) Créer le champ dans la table :

Code :
ALTER TABLE ta_table ADD COLUMN VARCHAR ton_champ;
2) Ajouter une contrainte à la table :

Code :
ALTER TABLE ta_table ADD CONSTRAINT ta_contrainte CHECK (ton_champ IS NOT NULL)
GrandFather est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2004, 15h34   #10
Invité de passage
 
Inscription : mai 2004
Messages : 7
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 7
Points : 2
Points : 2
Vu que je bosse en 7.2.1, je comprends mieux pourquoi ça merde

Bon, j'ai essayé ta synatxe pour le "ADD CONSTRAINT" mais ça merde encore !!!

Je tape ça :
Code :
ALTER TABLE users ADD CONSTRAINT users_idtypeuser CHECK (idtypeuser IS NOT NULL);
Et ça me renvoie ça :
Code :
1
2
3
PostgreSQL said: ERROR: AlterTableAddConstraint: rejected due TO CHECK constraint users_idtypeuser 
Your query: 
ALTER TABLE users ADD CONSTRAINT users_idtypeuser CHECK (idtypeuser IS NOT NULL)
J'suis dég', je pensais bien en être sorti cette fois-ci
J'ai aussi essayé de mettre des "" autour du nom des tables et des champs mais y veut toujours pô
Est-ce que c'est spécifique à une version antérieure à la 7.3 ?
internet_killer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2004, 19h58   #11
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
7.2.1 !? tu devrais conseiller à ton DB Admin de passer au moins en 7.3 ...
En ce qui concerne ton problème, j'ai juste oublié de te préciser une chose : quand tu ajoutes une contrainte sur une table, Postgres vérifie avant que tous les enregistrements déjà présents dans la table seront cohérents avec ta contrainte. Si c'est pas le cas, il proteste (avec le message que tu as eu). Tu dois donc avoir des enregistrements avec le champ idtypeuser à NULL.
Pour pouvoir appliquer ta contrainte, tu dois donc avant initialiser ces champs avec une valeur quelconque, avec une requête du style (si idtypeuser est de type numérique) :

Code :
UPDATE users SET idtypeuser = 0 WHERE idtypeuser IS NULL
... et après tu pourras faire ton ALTER TABLE users ADD CONSTRAINT
GrandFather est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2004, 10h24   #12
Invité de passage
 
Inscription : mai 2004
Messages : 7
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 7
Points : 2
Points : 2
Oyo !

Bon, avec ta requête de remplissage avec des 0, j'ai réussi à mettre en place la contrainte
Code :
ALTER TABLE users ADD CONSTRAINT users_idtypeuser CHECK (idtypeuser IS NOT NULL);
Donc c'est super, je vous remercie tous pour vos conseils ;-)
Juste un truc rigolo avec Postgre 7.2.1, quand tu ne renseignes pas le champ 'idtypeuser', j'ai l'impression qu'il contourne la contrainte parce qu'il met de lui même 0 :o
Donc je pense que la contrainte met une valeur par défaut sur ce champ mais bon, c'est déjà pas mal 8)

Allez, à plus tard sur le board les gens et encore

à tous
internet_killer est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h14.


 
 
 
 
Partenaires

Hébergement Web