Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/02/2011, 11h17   #1
Membre du Club
 
Inscription : février 2007
Messages : 163
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 163
Points : 41
Points : 41
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 :
1
2
3
4
5
6
CREATE TABLE t1(
 idTable INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
 ...,
 monChamps INT NOT NULL DEFAULT MAX()
);
Kimado est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2011, 09h26   #2
Membre émérite
 
Avatar de Drizzt [Drone38]
 
Homme
Inscription : mai 2004
Messages : 739
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : mai 2004
Messages : 739
Points : 979
Points : 979
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
Drizzt [Drone38] est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2011, 10h58   #3
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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 ?
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2011, 07h37   #4
Membre expérimenté
 
Inscription : octobre 2002
Messages : 654
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 654
Points : 552
Points : 552
Bonjour,
Attention est-ce que les solutions proposées fonctionneront lors d'un

Code :
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
soazig est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2011, 09h18   #5
Membre émérite
 
Avatar de Drizzt [Drone38]
 
Homme
Inscription : mai 2004
Messages : 739
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : mai 2004
Messages : 739
Points : 979
Points : 979
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
Drizzt [Drone38] est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2011, 10h26   #6
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 17h54   #7
Membre du Club
 
Inscription : février 2007
Messages : 163
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 163
Points : 41
Points : 41
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.
Kimado est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 18h34   #8
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 081
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 081
Points : 1 875
Points : 1 875
Bonjour,
Est-ce qu'une colonne de type sérial ne ferait pas l'affaire ?

Tatayo.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2011, 15h36   #9
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 993
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 993
Points : 18 246
Points : 18 246
Envoyer un message via MSN à CinePhil
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2011, 15h47   #10
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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 :
1
2
3
4
5
6
7
8
9
10
11
 
INSERT INTO MaTable (
    MaColonne1, 
    MaColonneOuJeVeuxMettreLeMax, 
    MonAutreConne
)
SELECT 
    'toto', 
    MAX(MaColonne), 
    'tata'
FROM MaTable
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h11.


 
 
 
 
Partenaires

Hébergement Web