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

Requêtes MySQL Discussion :

Insert dans une vue avec une valeur par défaut


Sujet :

Requêtes MySQL

  1. #1
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut Insert dans une vue avec une valeur par défaut
    Salut,



    Je rencontre un petit soucis un peu particulier, que j'aurais voulu résoudre en utilisant des VIEW, mais cela ne fonctionne pas comme je l'aurais pensé.


    Voici mon problème : j'ai une table définie de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE test
    (
    	id	bigint NOT NULL AUTO_INCREMENT,
    	num	bigint NOT NULL default 0,
    	text	varchar(20),
     
    	PRIMARY KEY(id, num)
    );
    Elle contient par exemple les valeurs suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    +----+-----+-------+
    | id | num | text  |
    +----+-----+-------+
    |  1 |   1 | t1    |
    |  2 |   1 | t2    |
    |  3 |   2 | t1    |
    +----+-----+-------+

    Je voudrais accéder de manière transparent seulement aux éléments avec num=1. J'utilise pour cela une VIEW définie comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE OR REPLACE
    ALGORITHM=MERGE
    VIEW view1
    AS
    SELECT id, text
    FROM test
    WHERE num = 1
    Juste là tout va bien et ma vue me retourne bien ce que je veux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    +----+-------+
    | id | text  |
    +----+-------+
    |  1 | t1    |
    |  2 | t2    |
    +----+-------+




    Le problème vient du fait que je voudrais faire des inserts sur cette vue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into view1(text) values('essai');
    Comme le champs 'num' n'est pas spécifié, il prend sa valeur par défaut (0), et donc le résultat n'apparait pas dans la vue


    En fait j'aurais voulu que lorsqu'on effectue des INSERT depuis la vue "view1", le champ "num" prennent automatiquement la valeur 1.

    J'ai pensé à un trigger, mais ils ne peuvent pas être utilisé sur une VIEW, et en le positionnant sur la table je n'arrive pas à déterminer si l'INSERT se fait depuis une VIEW ou pas.



    Si quelqu'un a une idée de piste ou une suggestion...




    a++

    PS : Je précise que je ne peux pas changer la valeur par défaut de la colonne, car je vais avoir plusieurs VIEW du même style.

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Je pense que je vais pouvoir m'en sortir avec des variables.





    Grosso modo mon application utilisera une vue à la fois.
    Je peux donc définir une variable qui indiquera le 'num' courant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET SESSION @current_num = 1;

    Ensuite il me faut définir une fonction pour récupérer cette valeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE FUNCTION	get_current_num()
    RETURNS BIGINT
    RETURN @current_num;
    En fait ceci est utile uniquement car on ne peut pas accéder directement à une variable depuis une VIEW.
    Donc ma VIEW SQL devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE OR REPLACE
    ALGORITHM=MERGE
    VIEW view1
    AS
    SELECT id, text
    FROM test
    WHERE num = get_current_num()
    WITH CHECK OPTION;

    Désormais j'utilise une seule VIEW paramétré via la variable "current_num".
    Il me suffit donc de définir cette variable afin de "passer" d'un num à l'autre.



    Désormais je peux donc utiliser la variable @current_num dans mon trigger afin de définir la valeur lorsqu'elle est absente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TRIGGER testref BEFORE INSERT ON test
    	FOR EACH ROW BEGIN
    		IF NEW.num = 0 AND @current_num IS NOT NULL THEN
    			SET NEW.num = @current_num;
    		END IF;
    	END;



    Bref il suffit de positionner @current_num pour accéder aux données de mon choix.

    Je ne peux pas encore vérifier le fonctionnement exact, mais je pense que ca devrait marcher


    a++

Discussions similaires

  1. [MySQL] insertion dans deux tables avec une clé étrangère
    Par reseau.reseau dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 23/03/2014, 13h04
  2. Réponses: 0
    Dernier message: 27/04/2012, 18h16
  3. [XL-2002] Macro de comparaison d'une cellule d'une feuille avec une cellule d'une autre feuille.
    Par steelydan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/09/2010, 12h59
  4. Réponses: 3
    Dernier message: 29/09/2009, 12h06
  5. Créer une vue avec une image au format postscript *.eps
    Par pobsteta dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 22/11/2007, 15h12

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