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

Oracle Discussion :

contrainte d'integrité dans sql


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 21
    Par défaut contrainte d'integrité dans sql
    Bonjour,
    pour implémenter mon modèle relationnel en sql j'ai besoin d'une contrainte d'integrité qui conditionne un attribut dans une entité par un autre attribu se trouvant dans une autre entité (est ce que c'est la commande CHECK dans ce cas et comment est la syntaxe?)

    merci

  2. #2
    Membre éclairé

    Inscrit en
    Septembre 2003
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 425
    Par défaut
    Je pense que tu parle de clé étrangère en fait :

    Fait une recherche sur FOREIGN KEY
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ALTER TABLE T1ADD (
      CONSTRAINT FK1 
     FOREIGN KEY (CH1) 
     REFERENCES T2 (CH34))
    /
    Les contraintes check sont plus "orientée" vérification de données. Tel que les valeurs de ce champs doite être comprise entre 1 et 150.

  3. #3
    Membre éprouvé
    Inscrit en
    Janvier 2005
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 129
    Par défaut
    Le systeme PRIMARY KEY / FOREIGN KEY répondra a tes besoins.

    Imaginons une table EMPLOYE
    emp_id
    nom
    dept_id

    Imaginons une table DEPT (service)
    dept_id
    nom

    Tu veux que l'ID de chaque employés et de chaque services soient unique.
    --> Tu créé une contrainte de clé primaire (PRIMARY KEY). Une sur le emp_id de la table EMPLOYE, et une sur dept_id de la table DEPT.

    Un employé est rattaché a un service. Dans la table EMPLOYE tu remarques que la colone dept_id est présente, tout comme dans la table DEPT. Pour t'assurer donc que tes employés sont bien rattaché a un service qui existe deja dans la table DEPT
    --> Tu créé une contrainte de clé étrangeère (FOREIGN KEY)

    A ce momont la, tes insertions de valeurs dans la colonne dept_id de la table EMPLOYE, seront conditionées par les valeurs de DEPT.dept_id

    En SQL mon exemple s'illustre comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    create table EMPLOYE (emp_id number(3), nom varchar2(10), dept_id number(2));
     
    create table DEPT (dept_id number(2), nom varchar2(10));
     
    alter table EMPLOYE add constraint "PK_EMP_ID" PRIMARY KEY (emp_id);
    alter table DEPT add constraint "PK_DEPT_ID" PRIMARY KEY (dept_id);
     
    alter table EMPLOYE add constraint "FK_DEPT_ID" FOREIGN KEY (dept_id) REFERENCES DEPT(dept_id);

  4. #4
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 21
    Par défaut
    Merci
    En fait j'ai une table Match qui contient le nombre de spectateur (nbspectateurs) et une table Stade qui contient le nombre de places dans ce stade (nbPlaces). la contrainte que je dois mettre dans l'entité Match est que nbspectateurs < nbPlaces.
    et aussi j'ai deja une clé primaire qui lie l'entité Match par l'entité stade (puisque c'est une relation simlpe (1,1))

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Dans ce cas, il faut créer un trigger car il n'existe pas de contrainte d'intégrité "simple" qui peut réaliser ce contrôle. Il y a peut-être une solution compliquée avec une vue matérialisée mais le trigger est sans doute la solution la plus simple.

  6. #6
    Membre éclairé

    Inscrit en
    Septembre 2003
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 425
    Par défaut
    Citation Envoyé par pifor
    Il y a peut-être une solution compliquée avec une vue matérialisée
    Je suis d'accord pour le trigger mais comment faire un contrainte calculée avec un vue matérialisée ?

  7. #7
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    L'idée est de créer une vue matérialisée qui représente une vue des données à vérifier et de créer la contrainte sur la vue matérialisée.

    Exemple:

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    SQL> 
    SQL> drop table tmatch;
     
    Table dropped.
     
    SQL> drop table tstade;
     
    Table dropped.
     
    SQL> drop materialized view mv;
     
    Materialized view dropped.
     
    SQL> 
    SQL> 
    SQL> whenever sqlerror exit failure;
    SQL> 
    SQL> create table  tstade(nst number primary key, npl number);
     
    Table created.
     
    SQL> create table  tmatch(nm number primary key, nst number references tstade, nsp number);
     
    Table created.
     
    SQL> 
    SQL> create materialized view log on tmatch
      2  with primary key, rowid
      3  including new values;
     
    Materialized view log created.
     
    SQL> 
    SQL> create materialized view log on tstade
      2  with primary key, rowid
      3  including new values;
     
    Materialized view log created.
     
    SQL> 
    SQL> create materialized view mv
      2  refresh force on commit
      3  as
      4  select tmatch.nm, tmatch.nst, tmatch.nsp, tstade.npl
      5  from tmatch, tstade
      6  where tmatch.nst = tstade.nst;
     
    Materialized view created.
     
    SQL> 
    SQL> alter table mv add constraint c_stade_trop_petit check (nsp <= npl);
     
    Table altered.
     
    SQL> 
    SQL> 
    SQL> insert into tstade values (1, 100);
     
    1 row created.
     
    SQL> insert into tmatch values (1, 1, 99);
     
    1 row created.
     
    SQL> insert into tmatch values (2, 1, 100);
     
    1 row created.
     
    SQL> commit;
     
    Commit complete.
     
    SQL> insert into tmatch values (3, 1, 101);
     
    1 row created.
     
    SQL> commit;
    commit
    *
    ERROR at line 1:
    ORA-12008: error in materialized view refresh path 
    ORA-02290: check constraint (TEST.C_STADE_TROP_PETIT) violated

Discussions similaires

  1. [Access] Nom d'une table avec un espace dans SQL
    Par Corsaire dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/04/2006, 15h50
  2. Importer des données dans sql server avec DELPHI ???
    Par moutanakid dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 11/08/2004, 17h22
  3. Copie de donnees dans SQL server 2000
    Par papayou42 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 19/12/2003, 10h58
  4. Procedure stockée avec ntext dans SQL server 2000
    Par nagababa dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 20/11/2003, 20h46
  5. Pb de critère dans sql
    Par Mr.Gus dans le forum Langage SQL
    Réponses: 2
    Dernier message: 19/09/2003, 07h58

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