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

Langage SQL Discussion :

Valeur par défaut de champs avec MAX


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 163
    Points : 74
    Points
    74
    Par défaut Valeur par défaut de champs avec MAX
    Bonjour.

    J'aurais voulu savoir s'il existait de définir la valeur par défaut d'un champ d'une table avec la valeur max de ce champ.
    En gros un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE t1(
     idTable INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
     ...,
     monChamps INT NOT NULL DEFAULT MAX()
    );

  2. #2
    Membre émérite Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Points : 2 453
    Points
    2 453
    Par défaut
    J'en doute fortement de façon aussi directe, mais tu peux simuler cela avec un trigger.

    A noter que si tu as des insertions massives à faire, un trigger va te plomber les perf donc à voir selon ton besoin.
    Je ne réponds pas aux questions techniques par MP, le forum est là pour cela.

    La crypto c'est comme les flambys, une fois que tu as trouvé la languette tu as juste à tirer pour tout faire tomber.

    (\ _ /)
    (='.'=)
    Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour


    Tu peux aussi créer une fonction scalaire qui te renvoi le max... et appeler cette fonction dans ton DEFAULT

    pense a créer un index sur cette colonne

    par curiosité, pourquoi veux-tu faire ça ?

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    Attention est-ce que les solutions proposées fonctionneront lors d'un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Insert into t1
    (liste_colonnes_sans_max)
    Select liste_colonnes
    from autre_table
    Avec une volumétrie conséquente.
    Cordialement
    Soazig

  5. #5
    Membre émérite Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Points : 2 453
    Points
    2 453
    Par défaut
    Pour le trigger, comme je l'avais indiqué, c'est plus que moyen niveau perf pour les insertions en masse.
    Je bypass toujours les triggers lorsque c'est possible pour les grosses insertions.

    Pour la solution de aieeeuuuu, qui est à mon avis plus adaptée, les impacts devraient être moindre.

    Cependant si tu as beaucoup d'insertions, il sera à mon avis plus efficace de calculer le max des valeurs présentes en table avant l'insertion, le max de tes valeurs à insérer et d'utiliser directement la plus grande valeur des deux dans ton insert. Ca evitera de calculer de nombreuses fois le max.

    Ce qui me choque plus dans un tel souhait, c'est que selon l'ordre d'insertion de tes données, tu n'auras pas forcement la même valeur de max. Et les anciennes valeurs inserées ne correponderont au final qu'à un max à instant donné. Voir à rien du tout en cas d'insertion massive (sauf si tu calcules le max avant).
    Du coup je rejoins aieeeuuuu c'est pour quelle utilisation ?
    Je ne réponds pas aux questions techniques par MP, le forum est là pour cela.

    La crypto c'est comme les flambys, une fois que tu as trouvé la languette tu as juste à tirer pour tout faire tomber.

    (\ _ /)
    (='.'=)
    Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par Drizzt [Drone38] Voir le message
    Cependant si tu as beaucoup d'insertions, il sera à mon avis plus efficace de calculer le max des valeurs présentes en table avant l'insertion, le max de tes valeurs à insérer et d'utiliser directement la plus grande valeur des deux dans ton insert. Ca evitera de calculer de nombreuses fois le max.
    Ce devrait etre le comportement du moteur : executer une seule fois la fonction par instruction INSERT, et non par ligne, donc l'impact devrait etre faible, même sur un gros volume inseré en bloc, surtout avec un index


    par contre, effectivement, si la table fait l'objet de nombreux inserts, la c'est autre chose...

    C'est pourquoi il faudrait en savoir un peu plus sur le contexte, pour trouver la meilleure solution car d'autres peuvent être envisagées...

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 163
    Points : 74
    Points
    74
    Par défaut
    Bonjour tout d'abord merci pour toutes vos réponses, je n'en attendais pas tant.

    Cette question était plus une curiosité qu'un réel problème puisque pour solutionner mon problème j'ai d'abord récupèré le max pour ensuite l'insèrer.

    Pour le contexte c'est une table dans laquelle j'ai un champ "ordre".
    Ceci représentera l'ordre dans lequel je vais afficher les résultats. Et donc, je voulais que quand j'ajoute un nouvel enregistrement par défaut je prenne le max.
    Mais étant donné que c'est une table qui sera amenée à être utilisée de façon moindre, j'ai simplement fait que lorsque j'enregistre dans ma base, si l'info n'a pas été donnée je récupère le max.

    Il s'agissait plus d'enrichir ma culture "SQLesque" que d'un réel problème. :p

    Merci encore.

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Est-ce qu'une colonne de type sérial ne ferait pas l'affaire ?

    Tatayo.

  9. #9
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par tatayo Voir le message
    Bonjour,
    Est-ce qu'une colonne de type sérial ne ferait pas l'affaire ?

    Tatayo.
    Ma compréhension du problème de Kimado me dit que non !

    Une colonne de type serial est pour auto-incrémenter un identifiant (clé primaire) d'une table.
    Ce que j'ai compris est que la table a une colonne "ordre" dans laquelle les valeurs ne sont pas forcément dans l'ordre d'enregistrement des données mais que lorsqu'on insère une nouvelle ligne, si la colonne ordre n'a pas de valeur affectée, alors on y affecte la valeur maxi de cette colonne.

    En gros, on pourrait avoir la situation suivante :
    id, donnee, ordre
    1, gdfh, 2
    2, kgfhkj, 5
    3, igdufhy, 3
    4, sdjgfh, 1
    5, dofjgh, 4

    Et à l'insertion d'une nouvelle ligne, si la valeur de l'ordre n'est pas donnée, il faudrait affecter la valeur 5.

    Un trigger peut effectivement faire l'affaire s'il ne faut insérer qu'une seule ligne.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  10. #10
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par Kimado Voir le message
    Cette question était plus une curiosité qu'un réel problème puisque pour solutionner mon problème j'ai d'abord récupèré le max pour ensuite l'insèrer.
    C'est sans doute la pire des solutions !

    Vous pourriez le faire en une seule requete :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    INSERT INTO MaTable (
        MaColonne1, 
        MaColonneOuJeVeuxMettreLeMax, 
        MonAutreConne
    )
    SELECT 
        'toto', 
        MAX(MaColonne), 
        'tata'
    FROM MaTable

Discussions similaires

  1. Réponses: 3
    Dernier message: 13/07/2011, 15h58
  2. Réponses: 3
    Dernier message: 28/06/2011, 13h52
  3. Réponses: 21
    Dernier message: 23/06/2008, 18h35
  4. [WSS3] valeur par défaut pour champ "Assigné à"
    Par vds2302 dans le forum SharePoint
    Réponses: 6
    Dernier message: 23/07/2007, 10h33
  5. Valeur par défaut de champs d'un sous-formulaire
    Par snoopy69 dans le forum Access
    Réponses: 2
    Dernier message: 21/10/2005, 07h44

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