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 Procédural MySQL Discussion :

INSERT INTO et foreign keys


Sujet :

SQL Procédural MySQL

  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    538
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 538
    Points : 262
    Points
    262
    Par défaut INSERT INTO et foreign keys
    Bonjours,

    je crée pour la première fois une base de données .



    J'ai deux tables 'STRUCTURES' et 'ADRESSES' avec une clé primaire en auto_increment (ID_STRUCTURE, ID_ADRESSE)

    Une 'Structure' a une 'Adresse' et une 'Adresse' appartient à une seul 'Structure', relation 1:1

    J'ai une clé étrangère de Structure vers Adresse :


    Je souhaite créer une nouvelle structure. J'utilise alors une procédure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    DELIMITER |
    CREATE PROCEDURE `AJOUTER_STRUCTURE` (IN inNOM VARCHAR(255), IN inSIRET BIGINT(14), IN inADRESSE VARCHAR(255))
    BEGIN
        -- Ajout de l'adresse
        INSERT INTO ADRESSES (ADRESSE) VALUES (inADRESSE);
        SET @ID_ADRESSE := (SELECT ID_ADRESSE FROM ADRESSES WHERE ADRESSE = inADRESSE);
     
        -- Ajout de la structure
        INSERT INTO STRUCTURES (NOM, SIRET, ID_ADRESSE) VALUES (inNOM, inSIRET, @ID_ADRESSE);
    END|
    DELIMITER ;

    Je suis obliger de passer par un SELECT pour renseigner la clé étrangère de Structures ...

    Existe t-il un meilleur moyen pour faire cette insertion ?

    Merci.

  2. #2
    Membre éprouvé Avatar de Oishiiii
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Points : 1 104
    Points
    1 104
    Par défaut
    Bonjour,

    Apparemment vous utilisez MySQL.
    Vous pouvez alors utiliser la fonction LAST_INSERT_ID() pour récupérer la dernière valeur générée par une colonne de type auto_increment.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET @ID_ADRESSE := (SELECT LAST_INSERT_ID());
    A tester, et peut-être à confirmer dans le forum MySQL

  3. #3
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    538
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 538
    Points : 262
    Points
    262
    Par défaut
    Merci.

    Voici ma nouvelle procédure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SET @tempID := (SELECT LAST_INSERT_ID() + 1 FROM ADRESSES);
     
    -- Ajout de l'adresse
    INSERT INTO ADRESSES VALUES (@tempID, inADRESSE, 0, 0);
     
    -- Ajout de la structure
    INSERT INTO STRUCTURES (SIRET, ID_ADRESSE, NOM) VALUES (inSIRET, @tempID, inNOM);
    Maintenant j'ai une erreur sur le deuxième insert :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Error Code: 1048. Column 'ID_ADRESSE' cannot be null
    Je ne comprend pas.

  4. #4
    Membre éprouvé Avatar de Oishiiii
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Points : 1 104
    Points
    1 104
    Par défaut
    Bonjour,

    LAST_INSERT_ID() retourne la dernière valeur générée par une colonne auto_increment dans votre script SQL.
    Peu importe la table.
    Donc ça s'utilise juste après un insert.

    Comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    -- Ajout de l'adresse
    INSERT INTO ADRESSES (ADRESSE) VALUES (inADRESSE);
    -- Récupère la valeur d'auto_increment généré par MySQL qui vient d'être insérée dans ADRESSES !!
    SET @ID_ADRESSE := (SELECT LAST_INSERT_ID());        
     
    -- Ajout de la structure
    INSERT INTO STRUCTURES (NOM, SIRET, ID_ADRESSE) VALUES (inNOM, inSIRET, @ID_ADRESSE);
    Si la structure fait référence à adresse, que ID_ADRESSE est une clé étrangère, pas besoin de faire +1 sur la valeur de LAST_INSERT_ID().

  5. #5
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 344
    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 344
    Points : 18 919
    Points
    18 919
    Par défaut
    Salut CliffeCSTL.

    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
    --------------
    set autocommit = 0
    --------------
     
    --------------
    start transaction
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
            default character set `latin1`
            default collate       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `adresses`
    --------------
     
    --------------
    CREATE TABLE `adresses`
    ( `id_adresse`  integer unsigned not null auto_increment primary key,
      `adresse`     varchar(255)     not null
    ) engine=innoDB
      default charset=latin1 collate=latin1_general_ci
      row_format=compressed
      AUTO_INCREMENT=101
    --------------
     
    --------------
    DROP TABLE IF EXISTS `structures`
    --------------
     
    --------------
    CREATE TABLE `structures`
    ( `id_structure`  integer unsigned not null auto_increment primary key,
      `siret`         varchar(255)     not null,
      `id_adresse`    integer unsigned not null,
      `nom`           varchar(255)     not null,
      CONSTRAINT `FK_01` FOREIGN KEY (`id_adresse`) REFERENCES `adresses` (`id_adresse`) ON DELETE CASCADE ON UPDATE CASCADE
    ) engine=innoDB
      default charset=latin1 collate=latin1_general_ci
      row_format=compressed
    --------------
     
    --------------
    create procedure `trait` (
    IN in_siret   varchar(255),
    IN in_adresse varchar(255),
    IN in_nom     varchar(255)
    )
    DETERMINISTIC
    NO SQL
    BEGIN
    DECLARE _incr integer unsigned DEFAULT NULL;
     
    insert into `adresses`   (`adresse`)                  values (in_adresse);
    select last_insert_id() into _incr;
    insert into `structures` (`siret`,`id_adresse`,`nom`) values (in_siret, _incr, in_nom);
    END
    --------------
     
    --------------
    call trait('123456789', 'rue des petits travaux', 'dupond')
    --------------
     
    --------------
    call trait('987654321', 'boulevard des allongés', 'durand')
    --------------
     
    --------------
    call trait('113357799', 'route sans issue',       'smith')
    --------------
     
    --------------
    select * from structures
    --------------
     
    +--------------+-----------+------------+--------+
    | id_structure | siret     | id_adresse | nom    |
    +--------------+-----------+------------+--------+
    |            1 | 123456789 |        101 | dupond |
    |            2 | 987654321 |        102 | durand |
    |            3 | 113357799 |        103 | smith  |
    +--------------+-----------+------------+--------+
    --------------
    select * from adresses
    --------------
     
    +------------+------------------------+
    | id_adresse | adresse                |
    +------------+------------------------+
    |        101 | rue des petits travaux |
    |        102 | boulevard des allongés |
    |        103 | route sans issue       |
    +------------+------------------------+
    --------------
    commit
    --------------
     
    --------------
    set autocommit = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

Discussions similaires

  1. probleme d'insertion avec des foreign key
    Par bssouf21 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 22/02/2012, 14h03
  2. [SQL-Server] insert into d'une table reliant deux tables(foreign key)
    Par evra76 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 03/07/2009, 11h38
  3. insertion invonlontaire de Foreign Keys
    Par karim_sousse dans le forum Hibernate
    Réponses: 1
    Dernier message: 29/06/2009, 18h18
  4. Réponses: 6
    Dernier message: 14/05/2009, 12h01

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