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

 MySQL Discussion :

Créer un trigger qui vérifiera avant ajout l’existence de numéro de téléphone


Sujet :

MySQL

  1. #1
    Invité
    Invité(e)
    Par défaut Créer un trigger qui vérifiera avant ajout l’existence de numéro de téléphone
    Coucou, je ne parviens pas à terminer 1 trigger pour le n° de telephone qui doit faire appel à 1 procedure stockee pour le n° de telephone. Je travaille dans les tables que j'ai trouvées sur la base de données https://sqlpro.developpez.com/cours/...s/mpdHotel.gif qui vient en fait des publications de SQL PRO https://sqlpro.developpez.com/cours/bddexemple et j'utilise Wamp (Version de MySQL :
    8.0.27) Merci à celles et ceux qui m'aideront <3

    Voici mon objectif :
    -créer un trigger qui vérifiera avant ajout, en faisant appel à une fonction/procédure stockée qui elle fera uniquement la vérification de l’existence de numéro de téléphone et de l’adresse e-mail un message d’erreur “l’e-mail et/ou le numéro de téléphone existe déjà”, si c’est le cas.
    -Faire deux SQL de test exemple : ajouter un client avec ses informations complètes (Nom, Prénom, société, téléphone, localisation tel, e-mail, localisation e-mail)
    Je vais d'abord réfléchir pour le numéro de téléphone pour ce post, ensuite je réfléchirai pour l'adresse mail dans un autre post. Donc pour ce post je parlerai de 1 trigger et 1 procedure concernant le numéro de telephone, et dans un autre post je parlerai de 1 trigger et 1 procedure concernant l'adresse mail car je ne vois pas comment faire autrement...

    Je vous présente mon trigger :
    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
     
    //pout le numero de telephone
    delimiter;
     
    create TRIGGER trg_ajout_num before insert on T_CLIENT
     
    FOR EACH ROW
     
    	BEGIN
     
    	insert into T_TELEPHONE (TEL_ID) values (new.TEL_ID);
     
    	END;
     
    delimiter ;|
    Je vous présente ma procédure stockée :
    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
     
    CREATE EXCEPTION EXC_EXISTE_DEJA 'Le numéro de téléphone @1 existe déjà';
     
    set term^;
    CREATE PROCEDURE Procedure_Ajouter_Numero(
       numero integer)
     
       RETURNS
       (numeroTelephone integer)
     
     as
     BEGIN
      //vérifier si le numéro n existerait pas déjà
      if ((SELECT tel_ID from T_Telephone where Tel_ID=:numero)
          )THEN
           EXCEPTION EXC_EXISTE_DEJA USING (:numero);
     
      //recherche le numéro de tel si pas précisé
      if (numero is null)
      then
       select TEL_ID from T_TELEPHONE where TEL_ID=:numero 
       into :numeroTelephone;
     
      //insère la ligne de commande
      insert into T_TELEPHONE (TEL_ID)
      values(:numero )
      returning TEL_ID into :numeroTelephone;
     
     
     END^
     
    /* comment je vais tester ensuite */
    select * from T_TELEPHONE
    EXECUTE PROCEDURE Procedure_Ajouter_Numero(0488448844,57,'test@email.com','localisation')

    Je vous présente la manière dont j'ai créé les tables en question (avec les référencements) :
    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
     
    /* Table : T_CLIENT*/
    create table T_CLIENT(
    CLI_ID INTEGER primary key references T_TITRE,
    TIT_CODE CHAR(8),
    CLI_NOM CHAR(32) not null,
    CLI_PRENOM VARCHAR(25),
    CLI_ENSEIGNE VARCHAR(100)
    );
    /* Index*/
    create unique index IDX_T_CLIENT_PK on T_CLIENT (CLI_ID);
    create index IDX_L_CLI_TIT_FK on T_CLIENT (TIT_CODE);
     
    /* Table : T_TELEPHONE*/
    create table T_TELEPHONE (
    TEL_ID INTEGER primary key,
    CLI_ID INTEGER references T_CLIENT,
    TYP_CODE CHAR(8) references T_TYPE,
    TEL_NUMERO CHAR(20) not null,
    TEL_LOCALISATION VARCHAR(64)
    );
     
    /* Index*/
    create unique index IDX_T_TELEPHONE_PK on T_TELEPHONE (TEL_ID);
    create index IDX_L_TEL_CLI_FK on T_TELEPHONE (CLI_ID);
    create index IDX_L_TEL_TYP_FK on T_TELEPHONE (TYP_CODE);
     
    /* Table : T_EMAIL */
    create table T_EMAIL (
    EML_ID INTEGER primary key references T_CLIENT,
    CLI_ID INTEGER not null,
    EML_ADRESSE VARCHAR(100) not null,
    EML_LOCALISATION VARCHAR(64)
    );
     
    /* Index*/
    create unique index IDX_T_EMAIL_PK on T_EMAIL (EML_ID);
    create index IDX_L_EML_CLI_FK on T_EMAIL (CLI_ID);

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 599
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Avant de se pencher sur les TRIGGER, il faut d'abord revoir la définition des tables qui ici est incorrecte :
    une PK dans une table qui fait référence à une autre table, qui plus est sans nommer la colonne référencée, c'est doublement incorrect !

    Accessoirement, pourquoi choisir du char(32) fixe pour le nom et du varchar(25) pour le prénom, pas très cohérent.
    Plus encore, la notion d'enseigne concerne les clients personnes morales (entreprises) alors que le nom et le prénom ne concernent que les personnes physiques, avoir ces 3 colonnes dans une même table implique qu'on aura systématiquement des colonnes marquées "null".
    Il aurait été préférable d'utiliser l'héritage et la spécialisation pour éviter cette situation.

    Ensuite, pour vérifier l'existence du n° de téléphone dans la table, il ne faut pas comparer le n° de téléphone et l'identifiant du téléphone !
    L'identifiant (TEL_ID) est une valeur technique, sans aucun rapport avec le numéro (TEL_NUMERO)
    Et enfin lors de l'insertion dans la table des téléphones, il faut alimenter la foreign key identifiant le client, sans quoi le téléphone inséré ne sera lié à personne...

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Accessoirement, pourquoi choisir du char(32) fixe pour le nom et du varchar(25) pour le prénom, pas très cohérent.
    Plus encore, la notion d'enseigne concerne les clients personnes morales (entreprises) alors que le nom et le prénom ne concernent que les personnes physiques, avoir ces 3 colonnes dans une même table implique qu'on aura systématiquement des colonnes marquées "null".
    Il aurait été préférable d'utiliser l'héritage et la spécialisation pour éviter cette situation.
    Bonjour, j'ai oublié de préciser qu'il s'agit d'un travail demandé par ma formatrice car je suis une formation en base de données, et que la formatrice nous a obligé de ne pas toucher aux types (donc ne pas les modifier) car c'est plus tard durant notre formation qu'elle nous fera ce type de remarque que vous venez de m'en faire part et que je vous en remercie car c'est enrichissant.

    Citation Envoyé par escartefigue Voir le message
    Avant de se pencher sur les TRIGGER, il faut d'abord revoir la définition des tables qui ici est incorrecte :
    une PK dans une table qui fait référence à une autre table, qui plus est sans nommer la colonne référencée, c'est doublement incorrect !
    Concernant la création des tables (la partie DDL), je comprends mieux mon erreur de départ à présent. Sauf que j'ignore toujours la manière de créer les liens entre les tables car ma formatrice m'a dit qu'on ne doit pas s'occuper des contraintes pour le moment. Voici par ailleurs ce que j'ai essayé maintenant pour les tables et j'aimerais un retour svp car je me sens perdue et j'obtiens un message d'erreur parlant de la PK :

    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
     
    /* Table : T_CLIENT*/
    create table T_CLIENT(
    CLI_ID INTEGER primary key,
    TIT_CODE CHAR(8) references T_TITRE (CLI_ID), //modification apportée
    CLI_NOM CHAR(32) not null,
    CLI_PRENOM VARCHAR(25),
    CLI_ENSEIGNE VARCHAR(100)
    );
    /* Index*/
    create unique index IDX_T_CLIENT_PK on T_CLIENT (CLI_ID);
    create index IDX_L_CLI_TIT_FK on T_CLIENT (TIT_CODE);
     
    /* Table : T_TELEPHONE*/
    create table T_TELEPHONE (
    TEL_ID INTEGER primary key,
    CLI_ID INTEGER references T_CLIENT (TIT_CODE), //modification apportée
    TYP_CODE CHAR(8) references T_TYPE,
    TEL_NUMERO CHAR(20) not null,
    TEL_LOCALISATION VARCHAR(64)
    );
     
    /* Index*/
    create unique index IDX_T_TELEPHONE_PK on T_TELEPHONE (TEL_ID);
    create index IDX_L_TEL_CLI_FK on T_TELEPHONE (CLI_ID);
    create index IDX_L_TEL_TYP_FK on T_TELEPHONE (TYP_CODE);

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 599
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par isset Voir le message
    Concernant la création des tables (la partie DDL), je comprends mieux mon erreur de départ à présent. Sauf que j'ignore toujours la manière de créer les liens entre les tables car ma formatrice m'a dit qu'on ne doit pas s'occuper des contraintes pour le moment. Voici par ailleurs ce que j'ai essayé maintenant pour les tables et j'aimerais un retour svp car je me sens perdue et j'obtiens un message d'erreur parlant de la PK :
    Je comprends le souci de votre formatrice de ne pas aborder tous les sujets à la fois, mais, la bonne méthode pour modéliser une base de données est de ne pas se préoccuper dans un premier temps des tables et donc encore moins des contraintes.
    Il faut seulement se préoccuper des règles de gestion, puis établir le modèle conceptuel, dans lequel il n'y a pas de tables, seulement des types d'entité et des associations

    Voici deux séries de règles de gestion différentes (notez la règle RG01a qui diffère et du coup les cardinalités coté CLI_client_1) et les modèles conceptuels (MCD) correspondants :

    Nom : MCD.png
Affichages : 602
Taille : 107,1 Ko

    N'importe quel logiciel de modélisation permet de dériver un modèle tabulaire à partir d'un MCD, c'est ce que j'ai fait ici avec Looping (excellent et gratuit), qui me donne ces deux modèles logiques :

    Nom : MLD.png
Affichages : 616
Taille : 118,6 Ko

    On voit que les tables sont très différentes :
    • deux tables seulement dans le premier MLD avec la présence d'une clef étrangère (FK) TIT_code dans la table CLI_client
    • trois tables dans le deuxième MLD, l'association n-aire étant devenue une table, dont la clef primaire est composée des identifiants respectifs des types d'entité CLI_client_1 et TIT_titre_1, par contre, il n'y a pas de FK dans la table CLI_client_1


    Ce faisant, la problématique des clefs étrangères et des contraintes associées ne se posent pas, elles sont générées automatiquement comme il faut en fonction des règles de gestion au travers du MCD. Voici le script obtenu pour ces deux modèles tabulaires, on y voit que les définitions des foreign key et des contraintes sont bien là, inutile de s'en préoccuper

    Code SQL : 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
    CREATE TABLE TIT_TITRE(
       TIT_code CHAR(8),
       TIT_libelle VARCHAR(32) NOT NULL,
       PRIMARY KEY(TIT_code)
    );
     
    CREATE TABLE CLI_client(
       CLI_id INT AUTO_INCREMENT,
       CLI_nom VARCHAR(50) NOT NULL,
       CLI_prenom VARCHAR(50) NOT NULL,
       CLI_enseigne VARCHAR(100) NOT NULL,
       TIT_code CHAR(8) NOT NULL,
       PRIMARY KEY(CLI_id),
       FOREIGN KEY(TIT_code) REFERENCES TIT_TITRE(TIT_code)
    );
    CREATE TABLE CLI_client_1(
       CLI_id INT AUTO_INCREMENT,
       CLI_nom VARCHAR(50) NOT NULL,
       CLI_prenom VARCHAR(50) NOT NULL,
       CLI_enseigne VARCHAR(100) NOT NULL,
       PRIMARY KEY(CLI_id)
    );
     
    CREATE TABLE TIT_TITRE_1(
       TIT_code CHAR(8),
       TIT_libelle VARCHAR(32) NOT NULL,
       PRIMARY KEY(TIT_code)
    );
     
    CREATE TABLE CP_posseder_1(
       CLI_id INT,
       TIT_code CHAR(8),
       PRIMARY KEY(CLI_id, TIT_code),
       FOREIGN KEY(CLI_id) REFERENCES CLI_client_1(CLI_id),
       FOREIGN KEY(TIT_code) REFERENCES TIT_TITRE_1(TIT_code)
    );

    Le problème, c'est d'apprendre à modéliser une base de données en commençant par réfléchir aux tables, c'est une très mauvaise approche et la source de bien des erreurs de modélisation.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Ok merci pour toutes ces informations , je vais voir ce que je peux faire maintenant pour ajuster mes tables en réfléchissant d'abord au MCD.

    Par ailleurs, est-ce que vous codez en ISO_88591 dans les exemples du post précédent svp ?

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 599
    Billets dans le blog
    10
    Par défaut
    Je n'ai codé aucun charset au niveau table et colonne, ce faisant, c'est le jeu de caractères de la base de données ou à défaut du serveur qui s'appliquera

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour à toutes et à tous,

    Je viens de suivre les conseils dans les post précédents et je suis enfin parvenue à 'faire fonctionner' toutes les tables et les liens correctement, un grand Merci à escartefigue

    Maintenant, j'aimerais savoir ce que vous penseriez de mon trgger et de ma procédure stockée pour le numéro de téléphone s'il vous plait ? Je rappelle mon objectif de départ (donné par ma formatrice) avant :

    -créer un trigger qui vérifiera avant ajout, en faisant appel à une fonction/procédure stockée qui elle fera uniquement la vérification de l’existence de numéro de téléphone et de l’adresse e-mail un message d’erreur “l’e-mail et/ou le numéro de téléphone existe déjà”, si c’est le cas.
    -Faire deux SQL de test exemple : ajouter un client avec ses informations complètes (Nom, Prénom, société, téléphone, localisation tel, e-mail, localisation e-mail)


    Voici ce que j'essaie d'améliorer (je n'ai rien su trouvé de mieux que de citer les bons champs dans les tables en comparaison à ce qu'on peut lire dans mon premier post...

    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
     
     
    //trigger pour le numero de telephone
    delimiter;
     
    create TRIGGER trg_ajout_num before insert on T_CLIENT
     
    FOR EACH ROW
     
    	BEGIN
     
    	insert into T_TELEPHONE (CLI_ID) values (new.CLI_ID);
     
    	END;
     
    delimiter ;|
     
     
     
     
    // procedure stockée pour le numéro de téléphone
     
    CREATE EXCEPTION EXC_EXISTE_DEJA 'Le numéro de téléphone @1 existe déjà';
     
    set term^;
    CREATE PROCEDURE Procedure_Ajouter_Numero(
       numero integer)
     
       RETURNS
       (numeroTelephone integer)
     
     as
     BEGIN
      //vérifier si le numéro n existerait pas déjà
      if ((SELECT CLI_ID from T_Telephone where CLI_ID=:numero)
          )THEN
           EXCEPTION EXC_EXISTE_DEJA USING (:numero);
     
      //recherche le numéro de tel si pas précisé
      if (numero is null)
      then
       select CLI_ID from T_TELEPHONE where CLI_ID=:numero 
       into :numeroTelephone;
     
      //insère la ligne de commande
      insert into T_TELEPHONE (CLI_ID)
      values(:numero )
      returning CLI_ID into :numeroTelephone;
     
     
     END^
     
    /* comment je vais tester ensuite */
    select * from T_TELEPHONE
    EXECUTE PROCEDURE Procedure_Ajouter_Numero(0488448844,57,'test@email.com','localisation')


    Merci pour les avis <3



    EDIT :

    Quelqu'un pourrait-il svp me donner son avis quant à la syntaxe ou à la procédure que j'ai suivie (à partir des mes commentaires au sein même du code ci-dessus) car je ne pas sûre d'avoir bien compris le raisonnement à avoir derrière la création d'un trigger ou d'une procédure stockée ? Ma formatrice m'a dit que je devrais m'appliquer davantage mais je suis consciente d'avoir des difficultés pour construire un trigger ou une procédure stockée bien que j'ai pris la peine de me documenter (en français) pour trouver des tutoriels et de la documentation pour m'aider à travailler et de parvenir à m'expliquer à moi-même ce que je fais...

    Bonne année à toutes et à tous !
    Dernière modification par Invité ; 04/01/2023 à 14h37.

  8. #8
    Membre Expert
    Homme Profil pro
    tripatouilleur de code pour améliorer mon quotidien boulistique
    Inscrit en
    Février 2008
    Messages
    946
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : tripatouilleur de code pour améliorer mon quotidien boulistique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2008
    Messages : 946
    Par défaut
    Bonjour

    Je ne maîtrise pas trop les Triggers, mais à ma première vue, il y a un problème.

    En effet, dans votre trigger vous ne faîtes pas appel à une procédure stockée

    D'autre part, la fonction d'insertion du numéro de téléphone me semble bancale.
    Pour cette insertion, il faut le numéro de téléphone à insérer et le l'identifiant du client.

    Pierre

  9. #9
    Invité
    Invité(e)
    Par défaut
    Merci pour la remarque. En effet, je ne parviens pas à piger le truc au niveau de la syntaxe SQL concernant le fait qu'un trigger face appel à une procédure stockée. Pourrais-tu me donner un exemple bref svp car sur internet je trouve que de la documentation compliquée pour mon niveau... Merci d'avance.

    EDIT : à partir de quelle ligne dans mon trigger est-ce que cela pose problème svp ? De cette manière, je pourrais mieux visualiser d'où vient le soucis quant à ma compréhension pour appeler une procédure stockée à partir d'un trigger ? Par ailleurs ma formatrice ne m'a pas donné d'exemple concret (de ligne de code d'un trigger qui appelle une procédure stockée) c'est à moi de chercher et je ne sais visiblement pas me documenter... Je n'ai pas non plus trouvé le bon exemple sur les autres discussions dans 'débutant' Merci d'avance

    Isset
    Dernière modification par Invité ; 12/01/2023 à 22h45.

  10. #10
    Membre Expert
    Homme Profil pro
    tripatouilleur de code pour améliorer mon quotidien boulistique
    Inscrit en
    Février 2008
    Messages
    946
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : tripatouilleur de code pour améliorer mon quotidien boulistique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2008
    Messages : 946
    Par défaut
    Trigger

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    /trigger pour le numero de telephone
    delimiter;
     
    create TRIGGER trg_ajout_num before insert on T_CLIENT
     
    FOR EACH ROW
     
    	Call PROCEDURE_XXX ;
     
    delimiter ;|

    Procédure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     insert into T_TELEPHONE (CLI_ID)
      values(:numero )
      returning CLI_ID into :numeroTelephone;

  11. #11
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 872
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 872
    Par défaut
    Salut à tous.

    Tester un numéro de téléphone avant son insertion :
    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
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE IF NOT EXISTS `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `client`
    --------------
     
    --------------
    CREATE TABLE `client`
    ( `id`       integer unsigned not null auto_increment primary key,
      `nom`      varchar(255)     not null,
      `prenom`   varchar(255)     not null
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `client` (`nom`,`prenom`) values
     ('Nom 1','Prénom 1'),('Nom 2','Prénom 1'),('Nom 3','Prénom 3')
    --------------
     
    --------------
    select * from `client`
    --------------
     
    +----+-------+----------+
    | id | nom   | prenom   |
    +----+-------+----------+
    |  1 | Nom 1 | Prénom 1 |
    |  2 | Nom 2 | Prénom 1 |
    |  3 | Nom 3 | Prénom 3 |
    +----+-------+----------+
    --------------
    DROP TABLE IF EXISTS `telephone`
    --------------
     
    --------------
    CREATE TABLE `telephone`
    ( `id`          integer unsigned not null auto_increment primary key,
      `client_fk`   integer unsigned not null,
      `numero`      char(10)         not null,
      CONSTRAINT `FK_01` FOREIGN KEY (`client_fk`) REFERENCES `client` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    DROP TRIGGER IF EXISTS `verify`
    --------------
     
    --------------
    CREATE TRIGGER `verify`
    BEFORE INSERT ON `telephone`
    FOR EACH ROW
    BEGIN
      DECLARE _cli   integer DEFAULT NULL;
      DECLARE _msg   varchar(255);
     
      IF ((select 1 from `client` where id = new.client_fk) IS NULL) THEN
         set _msg = concat('Le client ', new.client_fk, ' n''existe pas !');
         SIGNAL SQLSTATE VALUE '07777' SET MESSAGE_TEXT = _msg, MYSQL_ERRNO = 1;
      END IF;
     
      select client_fk into _cli from `telephone` where numero = new.numero;
     
      IF (_cli IS NOT NULL) THEN
         set _msg = concat('Le numero de téléphone ', new.numero, ' du client ', new.client_fk, ' est déjà utilisé par le client ', _cli, ' !');
         SIGNAL SQLSTATE VALUE '07777' SET MESSAGE_TEXT = _msg, MYSQL_ERRNO = 2;
      END IF;
     
    END
    --------------
     
    --------------
    INSERT INTO `telephone` (`client_fk`,`numero`) values (1,'1234567890')
    --------------
     
    --------------
    INSERT INTO `telephone` (`client_fk`,`numero`) values (2,'1357924680')
    --------------
     
    --------------
    INSERT INTO `telephone` (`client_fk`,`numero`) values (2,'1234567890')
    --------------
     
    ERROR 2 (07777) at line 94: Le numero de téléphone 1234567890 du client 2 est déjà utilisé par le client 1 !
    --------------
    INSERT INTO `telephone` (`client_fk`,`numero`) values (4,'4567890123')
    --------------
     
    ERROR 1 (07777) at line 95: Le client 4 n'existe pas !
    --------------
    INSERT INTO `telephone` (`client_fk`,`numero`) values (3,'4567890123')
    --------------
     
    --------------
    select * from `telephone`
    --------------
     
    +----+-----------+------------+
    | id | client_fk | numero     |
    +----+-----------+------------+
    |  1 |         1 | 1234567890 |
    |  2 |         2 | 1357924680 |
    |  3 |         3 | 4567890123 |
    +----+-----------+------------+
    --------------
    COMMIT
    --------------
     
    Appuyez sur une touche pour continuer...
    @+

  12. #12
    Invité
    Invité(e)
    Par défaut
    Merci pour les exemples très inspirants, j'ai pigé le truc merci

Discussions similaires

  1. Ajouter des liens vers des numéros de téléphone
    Par bronon dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 31/03/2017, 17h19
  2. [Article] Comment ajouter des liens vers des numéros de téléphone
    Par FirePrawn dans le forum Publications (X)HTML et CSS
    Réponses: 7
    Dernier message: 08/11/2012, 17h21
  3. [HTML 5] Comment ajouter des liens vers des numéros de téléphone
    Par FirePrawn dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 08/11/2012, 17h21
  4. Réponses: 1
    Dernier message: 19/06/2012, 06h53

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