IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PostgreSQL Discussion :

spécifier NOT NULL - champ existant


Sujet :

PostgreSQL

  1. #1
    Candidat au Club
    Inscrit en
    Mai 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 7
    Points : 3
    Points
    3
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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)
    Voir... c'est croire !!! (powered by W3)

  2. #2
    Membre actif

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    209
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2003
    Messages : 209
    Points : 249
    Points
    249
    Par défaut
    La syntaxe est la suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  3. #3
    Candidat au Club
    Inscrit en
    Mai 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    alter table users alter typeuser set not null;
    Ca m'a donné un message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Voir... c'est croire !!! (powered by W3)

  4. #4
    Membre actif

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    209
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2003
    Messages : 209
    Points : 249
    Points
    249
    Par défaut
    Fait un et redonne moi la structure de ta table, stp!

    A+

  5. #5
    Candidat au Club
    Inscrit en
    Mai 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Voir... c'est croire !!! (powered by W3)

  6. #6
    Membre actif

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    209
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2003
    Messages : 209
    Points : 249
    Points
    249
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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?

  7. #7
    Candidat au Club
    Inscrit en
    Mai 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    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
    Voir... c'est croire !!! (powered by W3)

  8. #8
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE ta_table ADD COLUMN VARCHAR ton_champ;
    2) Ajouter une contrainte à la table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE ta_table ADD CONSTRAINT ta_contrainte CHECK (ton_champ IS NOT NULL)
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  9. #9
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE ta_table ADD COLUMN VARCHAR ton_champ;
    2) Ajouter une contrainte à la table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE ta_table ADD CONSTRAINT ta_contrainte CHECK (ton_champ IS NOT NULL)
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  10. #10
    Candidat au Club
    Inscrit en
    Mai 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE users ADD CONSTRAINT users_idtypeuser CHECK (idtypeuser IS NOT NULL);
    Et ça me renvoie ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?
    Voir... c'est croire !!! (powered by W3)

  11. #11
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE users SET idtypeuser = 0 WHERE idtypeuser IS NULL
    ... et après tu pourras faire ton ALTER TABLE users ADD CONSTRAINT
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  12. #12
    Candidat au Club
    Inscrit en
    Mai 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Oyo !

    Bon, avec ta requête de remplissage avec des 0, j'ai réussi à mettre en place la contrainte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Voir... c'est croire !!! (powered by W3)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. update ou champs not NULL
    Par magic charly dans le forum Oracle
    Réponses: 2
    Dernier message: 19/02/2007, 16h08
  2. problème de champs not null qui sont marqués null à la création
    Par Elianora la blanche dans le forum Outils
    Réponses: 6
    Dernier message: 02/02/2007, 09h33
  3. not null / obliger de specifier la valeur d'un champs
    Par ]matmat[ dans le forum Requêtes
    Réponses: 6
    Dernier message: 16/10/2006, 20h04
  4. Champs null ou Not Null
    Par Feezdev dans le forum Access
    Réponses: 2
    Dernier message: 28/07/2006, 11h34
  5. [TStringField] inserer dans un champs NOT NULL une chaine vi
    Par kase74 dans le forum Bases de données
    Réponses: 2
    Dernier message: 16/09/2005, 14h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo