Partage
  • Partager sur Facebook
  • Partager sur Twitter

Les jointures et INSERT INTO ?

Sujet résolu
    12 septembre 2011 à 12:03:51

    Bonjour,

    Je me suis mis récemment à PDO après avoir retravaillé l'architecture de ma base de données et désormais je m'attaque à la réécriture de mes requêtes.

    Suite à ma nouvelle architecture, de nouvelles requêtes sont nécessaires et j'en viens à mon soucis :

    Lorsqu'un utilisateur s'inscrit sur mon site auparavant une seule table se chargeait d'enregistrer les informations. Maintenant cela est traité par plusieurs tables :

    - T_ACCOUNT (T_ACC_ID, T_LOGIN, T_PASS ...)
    - T_INFORMATION (T_INF_ID, T_ACC_ID, T_INF_PSEuDO, T_INF_SEX ...)
    - T_SETTING (T_SET_ID, T_ACC_ID, T_SET_LANGUAGE, T_SET_TIMEZONE ...)

    De ce fait dorénavant pour enregistrer un utilisateur je dois faire trois requêtes au lieu d'une seule :

    $query_inscription = "INSERT INTO T_ACCOUNT (T_ACC_LOGIN, T_ACC_PASSWORD, T_ACC_SALT01, T_ACC_SALT02, T_ACC_KEY, T_ACC_STATUT, T_ACC_TIMESTAMP, T_ACC_COOKIE) VALUES (:login, :password, :salt01, :salt02, :key, '0', :timestamp, 'UNDEF')"; // Création d'un compte (T_ACCOUNT)
    $inscription = $pdo->prepare($query_inscription);
    $inscription->bindValue(':login', $login, PDO::PARAM_STR);
    $inscription->bindValue(':password', $hash_pass_final, PDO::PARAM_STR);
    $inscription->bindValue(':salt01', $salt01, PDO::PARAM_STR);
    $inscription->bindValue(':salt02', $salt02, PDO::PARAM_STR);
    $inscription->bindValue(':key', $confirmation, PDO::PARAM_STR);
    $inscription->bindValue(':timestamp', $time_drop_account, PDO::PARAM_INT);
    $inscription->execute();
    $account_id = $pdo->lastInsertId();
    $query_inscription_infos = "INSERT INTO T_INFORMATION (T_ACC_ID, T_INF_PSEUDO, T_INF_MAIL, T_INF_FIRSTNAME, T_INF_SURNAME, T_INF_SEX, T_INF_AGE, T_INF_COUNTRY) VALUES (:account_id, :pseudo, :mail, :firstname, :surname, :sex, :age, :country)"; // Informations personnelles et publiques de l'utilisateur (T_INFORMATION)
    $inscription_infos = $pdo->prepare($query_inscription_infos);
    $inscription_infos->bindValue(':account_id', $account_id, PDO::PARAM_INT);
    $inscription_infos->bindValue(':pseudo', $pseudo, PDO::PARAM_STR);
    $inscription_infos->bindValue(':mail', $mail, PDO::PARAM_STR);
    $inscription_infos->bindValue(':firstname', '0', PDO::PARAM_STR);
    $inscription_infos->bindValue(':surname', '0', PDO::PARAM_STR);
    $inscription_infos->bindValue(':sex', '0', PDO::PARAM_STR);
    $inscription_infos->bindValue(':age', '0', PDO::PARAM_INT);
    $inscription_infos->bindValue(':country', '0', PDO::PARAM_STR);
    $inscription_infos->execute();
    $query_inscription_setting = "INSERT INTO T_SETTING (T_ACC_ID, T_SET_LANGUAGE, T_SET_TIMEZONE, T_SET_GESTADMIN) VALUES (:account_id, :language, :timezone, :gestadmin)"; // Paramètres du compte de l'utilisateur (T_SETTING)
    $inscription_setting = $pdo->prepare($query_inscription_setting);
    $inscription_setting->bindValue(':account_id', $account_id, PDO::PARAM_INT);
    $inscription_setting->bindValue(':language', '2', PDO::PARAM_INT);
    $inscription_setting->bindValue(':timezone', '290', PDO::PARAM_INT);
    $inscription_setting->bindValue(':gestadmin', '0', PDO::PARAM_INT);
    $inscription_setting->execute();
    


    Puis j'ai réalisé qu'avec les jointures il serait "possible" de ne faire que deux requêtes, c'est à dire tout d'abord une requête sur la table T_ACCOUNT puis ensuite je pourrai faire une seconde requête englobant les tables T_INFORMATION et T_SETTING.
    Seulement voilà, de toutes les informations que j'ai pu consulter sur les jointures je n'ai vu que des exemples avec "SELECT", néanmoins en cherchant sur le net je n'ai pas eu la confirmation ou non que ça soit faisable.

    De ce fait ma question est la suivante : est-il réalisable de faire un INSERT INTO sur deux ou plusieurs tables (j'ai notamment pensé en utilisant les jointures)?

    Merci par avance !
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      12 septembre 2011 à 12:45:40

      Il me semble que certains SGBD le permettent (Oracle).
      • Partager sur Facebook
      • Partager sur Twitter
        14 septembre 2011 à 0:03:42

        Salut,

        Non tu ne peux pas effectuer un JOIN avec un INSERT, ça n'aurait pas beaucoup de sens :). La norme SQL ne permet pas de faire une insertion simultanément dans deux tables.

        Par contre, je te conseille d'effectuer tes insertions dans une transaction afin de ne pas avoir une incohérence dans ta BDD si une erreur se produit.

        Tu peux également regarder du côté des triggers. Tu peux écrire un trigger qui fera les insertions dans Table2 et Table3, dès l'insertion dans Table1.
        • Partager sur Facebook
        • Partager sur Twitter
          14 septembre 2011 à 13:54:48

          Merci pour vos infos tous les deux :)

          Je vais en effet m'orienter vers les transactions afin d'éviter un quelconque problème, pour les triggers je dois me documenter davantage je n'ai fait que survoler le sujet.
          • Partager sur Facebook
          • Partager sur Twitter

          Les jointures et INSERT INTO ?

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown