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

SQL Oracle Discussion :

Création d'une table avec condition


Sujet :

SQL Oracle

  1. #1
    Membre actif Avatar de sofiane_bfm007
    Profil pro
    Consultant Décisionnel
    Inscrit en
    Mai 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Décisionnel

    Informations forums :
    Inscription : Mai 2008
    Messages : 261
    Points : 242
    Points
    242
    Par défaut Création d'une table avec condition
    bonjour, je voudrais creer une table qui s appel Bourder qui ne doit pas avoir des données en double. lors de l insertion
    c'est a dire dans cette relation, le faite que la FRANCE et ITALIE ont une frontiere de 488km doit etre representé par le n-uplet (F,I,488) ou (I,F,488) mais pas les deux.
    merci

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 207
    Points : 237
    Points
    237
    Par défaut
    Bonsoir,

    Tu peux faire un trigger:

    ex:
    Creation de la table:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE TABLE Bourder (Pays_1 varchar2(2),Pays_2 varchar2(2), long_frontiere number);

    Création du trigger

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE OR REPLACE TRIGGER Valide_Pays before insert or update ON Bourder for each row
    declare p1 varchar2(2);
    	    p2 varchar2(2);
    	v_exists number;
    BEGIN
       p1 := :new.Pays_1;
       p2 := :new.Pays_2;
      select count(*) into v_exists from bourder where Pays_1= p2 and Pays_2=p1;
      IF (v_exists >0) then 
    	raise_application_error (-20000,'pas le droit, le couple inverse existe');
      END IF;
    END;

    Le code a été testé sur une 10.2.0.1

    Je ne sais pas si c'est un cas d'école ou pour une vraie application, mais personnellement j'aurai créer une table Pays (Id_Pays number, Pays_Code Varchar2(2),....)

    puis une table lié Pays_Front (Id_Pays_Front number, Id_Pays Number, km_front number)

    Id_Pays étant une clé étrangère pointant sur pays.

    Laurent.
    My Oracle blog =>http://lao-dba.over-blog.com/

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 207
    Points : 237
    Points
    237
    Par défaut
    En fait, je viens de faire un petit tour sur le forum, et il y a déjà un post sur le sujet avec la même problématique !!!!

    http://www.developpez.net/forums/d62...rigger-create/

    C'est quoi le hic ? Vous venez sur le forum pour qu'on fasse vos devoirs ?

    laurent.

    My oracle blog => http://lao-dba.over-blog.com/

  4. #4
    Membre actif Avatar de sofiane_bfm007
    Profil pro
    Consultant Décisionnel
    Inscrit en
    Mai 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Décisionnel

    Informations forums :
    Inscription : Mai 2008
    Messages : 261
    Points : 242
    Points
    242
    Par défaut
    merci bien,
    le lien que vous m avez donnesz m interese bien,
    bonne nuit

  5. #5
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Résoudre ce type de problème avec des triggers est difficile !
    Voilà une autre solution
    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
     
    Connected to Oracle9i Enterprise Edition Release 9.2.0.5.0 
    Connected as mni
     
     
    SQL> 
    SQL> create table border (
      2    country1 varchar2(2),
      3    country2 varchar2(2),
      4    dist     number
      5  )
      6  /
     
    Table created
     
    SQL> alter table border
      2  add constraint pk_border primary key (country1, country2)
      3  /
     
    Table altered
     
    SQL> CREATE MATERIALIZED VIEW LOG ON border with rowid
      2  /
     
    Materialized view log created
     
    SQL> create materialized view border_mv
      2  refresh fast on commit
      3  as
      4  select rowid crid, country2 a, country1 b, 1 umarker
      5    From border
      6  UNION ALL
      7  select rowid crid, country1 a, country2 b, 2 umarker
      8    From border
      9  /
     
    Materialized view created
     
    SQL> alter table border_mv
      2  add constraint uk_border_mv unique (a, b)
      3  /
     
    Table altered
     
    SQL> insert into border values ('FR', 'BE', 1200)
      2  /
     
    1 row inserted
     
    SQL> insert into border values ('BE', 'FR', 1200)
      2  /
     
    1 row inserted
     
    SQL> commit
      2  /
     
    commit
     
    ORA-12008: erreur dans le chemin de régénération de la vue matérialisée
    ORA-00001: violation de contrainte unique (MNI.UK_BORDER_MV)
     
    SQL>

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

Discussions similaires

  1. Création d'une table avec conditions
    Par Najua dans le forum SAS Base
    Réponses: 1
    Dernier message: 16/04/2010, 16h41
  2. Réponses: 4
    Dernier message: 22/11/2007, 19h23
  3. Réponses: 12
    Dernier message: 12/06/2006, 14h29
  4. Création d'une table avec foreign key.
    Par Paulinho dans le forum Débuter
    Réponses: 6
    Dernier message: 01/12/2005, 18h47
  5. Création d'une table avec foreign key
    Par lepierre dans le forum Langage SQL
    Réponses: 5
    Dernier message: 17/09/2004, 14h20

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