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 :

problème requête CAST avec AND


Sujet :

PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 12
    Par défaut problème requête CAST avec AND
    Bonjour,

    Je travaille dans PostgreSQL. J'essaie de contrainte la clé primaire d'une table de toujours commencer par MET puis de garder le reste des caractères en tant qu'integer. Voici ma requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE TABLE meta_test
    ( 
    id_metadon_test character varying (14),
    nom character varying (64),
     
    CONSTRAINT meta_test_cast
    CHECK (
    (substring(id_metadon_test from 1 for 3)='MET')
    AND
    (cast(substring(id_metadon_test from 4 for 4) as integer))),
     
    CONSTRAINT meta_test_pk PRIMARY KEY (id_metadon_test));
    J'obtiens toujours cette erreur:
    'ERREUR: l'argument de AND doit être de type booléen, et non du type integer

    ********** Error **********

    ERREUR: l'argument de AND doit être de type booléen, et non du type integer
    SQL state: 42804'
    Je ne vois pas où est mon erreur. Est-ce que quelqu'un pourrait m'aider à corriger ma requête svp?

    De plus, j'aimerais savoir s'il est possible de mettre le nouveau type de donnée "AS SERIAL" plutôt que INTEGER. Ce serait beaucoup plus pratique d'avoir un champ qui s'auto-incrémente, mais en commençant toujours par "MET".

    Merci!

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par kalira Voir le message
    Je travaille dans PostgreSQL. J'essaie de contrainte la clé primaire d'une table de toujours commencer par MET puis de garder le reste des caractères en tant qu'integer.
    Et si tu abandonnais cette idée et créais plutôt une clé primaire auto-incrémentée ?

    Voici ma requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE TABLE meta_test
    ( 
    id_metadon_test character varying (14),
    nom character varying (64),
     
    CONSTRAINT meta_test_cast
    CHECK (
    (substring(id_metadon_test from 1 for 3)='MET')
    AND
    (cast(substring(id_metadon_test from 4 for 4) as integer))),
     
    CONSTRAINT meta_test_pk PRIMARY KEY (id_metadon_test));
    Ta seconde partie fait un CAST mais ne fait pas de test sur la valeur.
    Puisque tu veux un entier, ajoute BETWEEN 0 AND 9.

    De plus, j'aimerais savoir s'il est possible de mettre le nouveau type de donnée "AS SERIAL" plutôt que INTEGER. Ce serait beaucoup plus pratique d'avoir un champ qui s'auto-incrémente, mais en commençant toujours par "MET".
    Le pseudo type SERIAL va créer une séquence d'auto-incrémentation et doit être le type d'une nouvelle colonne ou à la création de la table. Je ne sais pas si on peut customiser le serial en y ajoutant un préfixe textuel. Mais encore une fois ce n'est pas une très bonne idée d'avoir une clé alphanumérique.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    Comme le CAST déclenche une exception SQL si le format de la donnée ne convient pas, l'utiliser dans un CHECK n'est pas la bonne technique.

    Une expression régulière en revanche, ferait ça très bien.

    Pour générer automatiquement MET suivi d'un entier, c'est assez facile:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    create sequence ma_sequence;
    CREATE TABLE test (
      id varchar(14) default 'MET' || nextval('ma_sequence'),
      ...
    );
    On pourrait aussi mettre une expression plus complexe qui formatterait le nombre avec 4 chiffres si nécessaire.

    A noter que SERIAL n'est pas un vrai type de données. C'est juste une facilité d'écriture que PostgreSQL va remplacer dynamiquement par la création d'une séquence et une expression par défaut pour la colonne prenant en compte cette séquence.
    Le véritable type de données correspondant à SERIAL est INTEGER.

  4. #4
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 12
    Par défaut
    Bonjour!

    J'ai utilisé l'exemple de estifolio pour créer une séquence d'auto-incrémentation de mon champs, puis je l'ai ajouté après "MET" par défaut et ça marche!
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE sequence ma_sequence
    increment by 1
    minvalue 1
    no cycle;
    CREATE TABLE test (
      id varchar(14) DEFAULT 'MET-' || NEXTVAL('ma_sequence'),
      nom character varying (64));

    Merci aussi pour les explications estifolio, je comprends mieux mon erreur par rapport à CHECK et ce qu'est SERIAL.

    CinePhil, je suis d'accord que c'est mieux d'utiliser seulement des clés primaires en chiffre et auto-incrémentées. Je cherche à mettre des lettres avant la clé pour en quelque sorte aider les personnes qui utiliseront la base de données à se démêler dans les multiples tables d'association qui finalement, ne contiendrait que des chiffres... Je voulais quand même l'auto-incrémenter pour en faciliter sa gestion, d'où ma question par rapport à serial.
    Juste pour ajouter aussi que j'ai essayé d'ajouter "BETWEEN 0 AND 9" comme tu m'as suggéré et ça a en effet fonctionné.


    Merci beaucoup à vous deux!

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 12
    Par défaut
    Euh... excuse-moi pour l'erreur dans ton nom estofilo...

  6. #6
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par kalira Voir le message
    CinePhil, je suis d'accord que c'est mieux d'utiliser seulement des clés primaires en chiffre et auto-incrémentées. Je cherche à mettre des lettres avant la clé pour en quelque sorte aider les personnes qui utiliseront la base de données à se démêler dans les multiples tables d'association qui finalement, ne contiendrait que des chiffres...
    Et bien au lieu de répéter le nom "id" pour toutes les colonnes d'identifiants, tu préfixes le nom de la colonne comme ça il n'y a plus d'ambiguïté.

    Et d'ailleurs les identifiants ne sont en principe jamais présentés à l'utilisateur mais seulement utilisés par la base de données et les programmes comme référence de données plus significatives.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. Problème requête HQL avec Like
    Par kakahn dans le forum Hibernate
    Réponses: 3
    Dernier message: 27/03/2013, 15h56
  2. requête sql avec and
    Par badi3a82 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 22/10/2008, 14h35
  3. Problème de cast avec un wxMenu
    Par mister3957 dans le forum wxWidgets
    Réponses: 3
    Dernier message: 09/09/2008, 10h41
  4. problème requête "like" avec chiffre
    Par bidibou dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 28/02/2008, 09h44
  5. Problème de cast avec l'outil de génération de requetes VS2005
    Par rabddoul dans le forum Accès aux données
    Réponses: 1
    Dernier message: 22/02/2007, 13h19

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