|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité régulier
![]() Développeur informatique Inscription : novembre 2011 Messages : 48 ![]() |
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. |
|
|
00
|
|
|
#2 | ||
|
Membre du Club
![]() Paul Étudiant Inscription : septembre 2011 Messages : 65 ![]() |
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 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 :
Après, il y a peut être des méthodes plus simple, mais personnelement je ferai comme ça :p |
||
|
|
00
|
|
|
#3 |
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 062 ![]() |
Pourquoi ne pas poser la question dans le forum SQL Server ?
Ca peut se faire avec un trigger par exemple. |
|
|
00
|
|
|
#4 |
|
Membre à l'essai
![]() Inscription : mai 2008 Messages : 12 ![]() |
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). |
|
|
00
|
|
|
#5 |
|
Invité régulier
![]() Développeur informatique Inscription : novembre 2011 Messages : 48 ![]() |
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
|
|
|
00
|
|
|
#6 | |
|
Invité régulier
![]() Développeur informatique Inscription : novembre 2011 Messages : 48 ![]() |
Citation:
Oui c'est ma clé primaire idRisque, cependant j'ai crée idRisqueAffiche, cela facilite la manipulation |
|
|
|
00
|
|
|
#7 |
|
Membre à l'essai
![]() Inscription : mai 2008 Messages : 12 ![]() |
Hop et voilà un truc qui te sauvera : l'attribut 'identity'
http://blog.developpez.com/sqlpro/p6...ec-sql-server/ |
|
|
00
|
|
|
#8 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 959 ![]() |
__________________
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 * * * * * |
|
00
|
|
|
#9 | |
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 062 ![]() |
Citation:
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). |
|
|
|
00
|
|
|
#10 |
|
Invité régulier
![]() Développeur informatique Inscription : novembre 2011 Messages : 48 ![]() |
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
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com