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 :

Contrainte d'intégrité


Sujet :

PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 7
    Par défaut Contrainte d'intégrité
    Bonjour,

    J'ai créé un domaine avec cette contrainte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE DOMAIN numtel AS varchar (14)
    CHECK (VALUE ~*
    E'0\\d{1}\.\\d{2}\.\\d{2}\.\\d{2}\.\\d{2}$');
    Lorsque j'essaye de faire l'insertion suivante dans ma table:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO imprimeurs (code_imprimeur, nom_imprimeur, coordonnees, nb_employes, web, telephone, fax)
                VALUES (10,'Imprimerie Nouvelle',ROW(22,'Rue','du champ de Blé',75004,'Paris'),500,'http://www.impnouv.fr','01.56.25.98.41',NULL)
    J'ai le message d'erreur suivant :
    ERROR: value for domain numtel violates check constraint "numtel_check"
    Je ne vois pas pourquoi je viole la contrainte, elle semble respecter le regex.

    Une idée ?

    Merci


  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 002
    Billets dans le blog
    6
    Par défaut
    Tout d'abord il n'y a aucun intérêt à stocker les points entres les groupes de chiffres des téléphones, ces points étant purement cosmétique et ne conviendront pas si l'on stocke des numéros internationaux notamment pour les USA ou le format habituel est par groupe de 3.
    Et dans une base de données, les données cosmétique n'ont pas leur place (pour des raisons de performance). Moins je stocke, mieux je me porte...
    Donc en tout état de cause vous ne devriez avoir que des chiffres sans espace ni points ni tiret...
    Vous pouvez donc simplifier votre regex....

    Rien ne vous empêche en outre d'utiliser une vue pour que l'affichage de vos numéros de téléphone soit présentés par groupe de 2 chiffres.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 7
    Par défaut
    Bonjour,

    Merci pour votre réponse.
    Effectivement, dans un cas réel, vos suggestions semblent pertinentes.
    Cependant dans le cas présent il s'agit d'un exercice et la contrainte m'est imposée par l'énoncé.

    Et je ne parviens toujours pas à comprendre le rejet de l insertion.


  4. #4
    Membre Expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Billets dans le blog
    8
    Par défaut
    Salut
    Je suppose que vous voulez cinq couples de chiffres et que le premier commence par zéro.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE DOMAIN numtel AS varchar (14)
    CHECK (VALUE ~'^(0[0-9])(\.[0-9][0-9]){4}');
    Quelle version d'os, de PostgreSQL utilisez-vous et avec client (pgadmin, psql...)? Chez mois le n'est pas accepté.
    @+

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 7
    Par défaut
    Bonjour. Merci pour votre retour.

    La creation du domaine m est imposee par l enonce de mon exercice avec le regex fourni plus haut.
    Je n ai eu aucun message d erreur lors de la creation, c est vraiment a l insertion que ca pose probleme.

    J utilise Pgadmin 3 Version 1.23.0b et Postgres 9.6

    Je me demande si le probleme ne pourrait pas venir des proprietes de ma base avec la propriete Collation definie sur English_Switzerland.1252

  6. #6
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 7
    Par défaut
    Je viens de droper le domaine et je l'ai recréé avec la regexp corrigée sans le E.

    J'ai maintenant pu insérer mon enregistrement.

    Je ne comprends pas pourquoi PostgreSQL ne plante pas chez moi avec la regexp initiale.

    J'en parlerai en cours la prochaine fois pour voir si je suis le seul à avoir eu le problème.

    Je vous remercie pour votre aide


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

Discussions similaires

  1. [REFERENCES INTEGRITE] Désactiver
    Par nico27 dans le forum InterBase
    Réponses: 6
    Dernier message: 19/03/2005, 16h40
  2. Pb contrainte d'integrité
    Par goulhasch dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 03/02/2005, 15h36
  3. [debutant]delete et contrainte d'integrite
    Par christophebmx dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 02/11/2004, 22h18
  4. INTEGRITE DE TRANSACTION FONCTION
    Par TrollMaster dans le forum Requêtes
    Réponses: 1
    Dernier message: 10/11/2003, 06h36
  5. Integrité référentiel sous postgres
    Par josoft dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 19/07/2003, 12h04

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