Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes 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 16/11/2011, 11h34   #1
Invité régulier
 
Homme
Développeur informatique
Inscription : novembre 2011
Messages : 48
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : novembre 2011
Messages : 48
Points : 8
Points : 8
Par défaut Auto increment spécifique

Bonjour à tous,

Je viens vous demander un peu d'aide sur un petit problème :

J'ai en fait deux tables dans ma base SQL Server, et deux champs me posent un souci, un idDomaine dans ma table Domaine et un idRisque dans la table Risque.
J'aimerais faire en sorte que lorsqu'un nouvel idDomaine est crée dans ma base (sous-entendu l'utilisateur l'a crée à travers l'application) mon idRisque recommence son incrémentation à 1.
J'ai regardé dans SQL Server,mais je ne sais pas si je dois passer directement en ligne de code pour l'indiquer à la base ou si cela se fait à travers SQL Server. Dans la logique, l'incrémentation continue mais ne recommence pas à 1, j'aimerais savoir si cela est possible avec une condition comme la mienne.


Merci d'avance

PS: pour faire simple, un domaine peut contenir plusieurs risques d'où le renouvellement de l'incrémentation.
Nikko42 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 11h45   #2
Membre du Club
 
Homme Paul
Étudiant
Inscription : septembre 2011
Messages : 65
Détails du profil
Informations personnelles :
Nom : Homme Paul
Âge : 19
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Distribution

Informations forums :
Inscription : septembre 2011
Messages : 65
Points : 46
Points : 46
Bonjour,

Je présume donc que dans ta table Risque, tu as un champ pour faire la liaison avec ta table Domaine.

Personnelement, je fairais une jointure gauche depuis la table domaine sur la table risque (si je suis pas clair :
Code :
FROM domaine AS D LEFT OUTER JOIN risque AS R ON D.idDomaine = R.id_domaine
(à voir en fonction de tes noms de champ)

pour récuperer l'identifiant maximum correspondant. Vu que un risque correspond à un seul domaine, et qu'un domaine peut avoir plusieurs risques.

Ainsi, en précisant l'id_domaine dans la clause where, tu obtiendra tous les risques correspondant au domaine. Avec un MAX(id_domaine) dans le select, tu prend le plus élevé. Il te suffit d'incrémenter cette valeur et de tant servir pour insérer la nouvelle ligne. (Bien sur, si le select ne retourne aucune ligne, la valeur sera 1)

EDIT : Ton champ de peut pas être auto incrémenté directement dans la base par conséquent, et ne peux pas être une clé primaire vu que des nombres se répetent

Cela pourrait donner une requête du genre :
Code :
1
2
3
SELECT MAX(R.id_risque) 
FROM domaine AS D LEFT OUTER JOIN risque AS R ON D.idDomaine = R.id_domaine
WHERE D.idDomaine = 'laValeurDuDomaine'
Cela te parrait clair?
Après, il y a peut être des méthodes plus simple, mais personnelement je ferai comme ça :p
Maniz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 11h54   #3
Membre Expert
 
Homme Sylvain Devidal
Chef de projets Générix
Inscription : février 2010
Messages : 1 062
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Devidal
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Chef de projets Générix
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2010
Messages : 1 062
Points : 1 515
Points : 1 515
Pourquoi ne pas poser la question dans le forum SQL Server ?

Ca peut se faire avec un trigger par exemple.
StringBuilder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 12h02   #4
Membre à l'essai
 
Inscription : mai 2008
Messages : 12
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 12
Points : 22
Points : 22
Yop,
Ma première intérrogation en te lisant est la suivante : IdRisque correspond-il a ta clé primaire de ta table risque?
Si oui, c'est tout bonnement impossible dans un sgbdr (deux clés ne peuvent être identique). Ne connaissant pas ton niveau en base de donnée relationnel, je préfère le rappeler.

Sinon, ce que tu souhaite est techniquement proche d'un compteur. Je ne sais pas quelle sgbdr tu utilise, mais certiains proposent l'attribut "AutoIncrement" pour ce genre de choses,
auquel tu colles une valeur initiale à "1" au moment du premier enregistrement.
Je te déconseille de faire un count() car tu te retrouveraient avec des problématique de doublons (et oui si tu supprimes des risques, le count() diminue).
Galerio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 12h05   #5
Invité régulier
 
Homme
Développeur informatique
Inscription : novembre 2011
Messages : 48
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : novembre 2011
Messages : 48
Points : 8
Points : 8
Merci pour vos réponses, mais j'ai oublié de préciser que je dispose de Subsonic donc je ne fais pas de requête SQL directement dans mon code
Nikko42 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 12h07   #6
Invité régulier
 
Homme
Développeur informatique
Inscription : novembre 2011
Messages : 48
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : novembre 2011
Messages : 48
Points : 8
Points : 8
Citation:
Envoyé par Galerio Voir le message
Yop,
Ma première intérrogation en te lisant est la suivante : IdRisque correspond-il a ta clé primaire de ta table risque?
Si oui, c'est tout bonnement impossible dans un sgbdr (deux clés ne peuvent être identique). Ne connaissant pas ton niveau en base de donnée relationnel, je préfère le rappeler.

Sinon, ce que tu souhaite est techniquement proche d'un compteur. Je ne sais pas quelle sgbdr tu utilise, mais certiains proposent l'attribut "AutoIncrement" pour ce genre de choses,
auquel tu colles une valeur initiale à "1" au moment du premier enregistrement.
Je te déconseille de faire un count() car tu te retrouveraient avec des problématique de doublons (et oui si tu supprimes des risques, le count() diminue).

Oui c'est ma clé primaire idRisque, cependant j'ai crée idRisqueAffiche, cela facilite la manipulation
Nikko42 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 12h14   #7
Membre à l'essai
 
Inscription : mai 2008
Messages : 12
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 12
Points : 22
Points : 22
Hop et voilà un truc qui te sauvera : l'attribut 'identity'

http://blog.developpez.com/sqlpro/p6...ec-sql-server/
Galerio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 13h26   #8
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 959
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 959
Points : 17 791
Points : 17 791
Lisez l'article que j'ai écrit à ce sujet :
http://sqlpro.developpez.com/cours/clefs/

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 13h42   #9
Membre Expert
 
Homme Sylvain Devidal
Chef de projets Générix
Inscription : février 2010
Messages : 1 062
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Devidal
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Chef de projets Générix
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2010
Messages : 1 062
Points : 1 515
Points : 1 515
Citation:
Envoyé par Nikko42 Voir le message
Merci pour vos réponses, mais j'ai oublié de préciser que je dispose de Subsonic donc je ne fais pas de requête SQL directement dans mon code
Cela confirme donc ce que je dis : un trigger fera parfaitement l'affaire pour calculer un nouveau IDRisque lors de l'insertion de la ligne.

Sinon, comme l'indique Galerio, une clé doit être unique.

Donc d'après ta règle, IDRisque ne peut en aucun cas constituer une clé primaire à lui seul.

En revanche, couplé à IDDomaine sous forme d'une clé composée cela peut parfaitement constituer une clé primaire (ceci dit, il vaut mieux, surtout sous SQL Server, opter pour une clé primaire mono-colonne, et faire de ce tuple une clé alternative).
StringBuilder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2011, 09h00   #10
Invité régulier
 
Homme
Développeur informatique
Inscription : novembre 2011
Messages : 48
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : novembre 2011
Messages : 48
Points : 8
Points : 8
Merci pour vos réponses, cependant, avant ça j'ai un autre problème tout bête mais j'y suis depuis quelques temps:

J'ai donc une liste déroulante qui affiche tous mes domaines, et une seconde dans laquelle les risques correspondant aux domaines devraient apparaître, c'est a dire que je dois pouvoir sélectionner mon domaine et tous ses risques correspondant à partir du numéro 1 dans la liste suivante.

Mais, je ne vois pas comment faire, car lorsque j'affiche un domaine, et que dans ma colonne idRisqueAffiche j'insère par exemple le numéro 1 pour chaque idDomaine, cela ne prend en compte que l'idDomaine correspondant, donc dans mon idDomaine numéro 1, je vais avoir "1,1,1" dans ma liste déroulante et rien pour les domaines suivants.

J'espère avoir été clair
Nikko42 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 13h40.


 
 
 
 
Partenaires

Hébergement Web