Auto-increment multiple

Auto-increment multiple - SQL/NoSQL - Programmation

Marsh Posté le 24-05-2009 à 19:32:14    

Bonjour à tous,
 
J'ai une petite question concernant l'auto-increment:
 
Imaginons la relation suivante:
http://images3.hiboox.com/images/2109/diapoe271522483ab9f48a0ed0bbc0b3ee1d8.png
La table "project" permet de répertorier le nom de divers projets.
La table "bug" permet de répertorier une liste de bug associer à un projet.
 
Mon problème est le suivant:
Je souhaite avoir un identifiant de bug qui s'auto-incrémente pour chaque projet. Ainsi, si j'ai les projets "Toto" et "Titi" et que j'ai pour chacun de ces projets plusieurs bugs, ça donnerait quelque chose comme ceci:
 
project:
id | name
0  | "Toto"
1  | "Titi"
 
et
 
bug:
id | project_id | label
0  | 0 | "Un bug"
1  | 0 | "Un autre bug"
2  | 0 | "Un autre autre bug"
0  | 1 | "Un autre autre autre bug"
1  | 1 | "Un autre autre autre autre bug"
2  | 1 | "Un autre autre autre autre autre bug..."
 
Hors, ça si je laisse l'auto-incremente de bug.id s'auto-incrémenter et que je ne renseigne que project_id et label quand je créer une nouvelle entré dans bug, j'obtien le résultat suivant:
 
bug:
id | project_id | label
0  | 0 | "Un bug"
1  | 0 | "Un autre bug"
2  | 0 | "Un autre autre bug"
3  | 1 | "Un autre autre autre bug"
4  | 1 | "Un autre autre autre autre bug"
5  | 1 | "Un autre autre autre autre autre bug..."
 
 
Y a-t'il une façon élégante de faire repartir l'auto-incrément de 0 pour chaque nouveau projet?

Reply

Marsh Posté le 24-05-2009 à 19:32:14   

Reply

Marsh Posté le 24-05-2009 à 20:05:21    

Si je le fait à la main, imaginons que je souhaite ajouter un bug relatif a un projet, je doit d'abord récupérer le plus grand ID déjà utilisé pour ce projet. Je procède donc ainsi:
 
SELECT MAX(id) FROM bug WHERE project_id = 1
 
J'incrément cette valeur ainsi obtenu de 1 pour la stocker dans une variable nommé new_id
 
Je peux enfin faire:
 
INSERT INTO `bug` (`id`, `project_id`, `label`) VALUES (
    new_id,
    '1',
    'Un bug'
);
 
 
Y a-til une façon d'effectuer cela en une seule requête en MySQL? Si je remplace new_id directement par la requête SELECT comme ceci:
 
INSERT INTO `bug` (`id`, `project_id`, `label`) VALUES (
    SELECT MAX(id) FROM bug WHERE project_id = 1,
    '1',
    'Un bug'
);
 
j'ai une erreur #1093 - You can't specify target table 'bug' for update in FROM clause :(

Reply

Marsh Posté le 25-05-2009 à 10:37:41    

Essaye ça ... j'ai pas vérifié niveau syntaxe Mysql ...
 
INSERT INTO `bug` (`id`, `project_id`, `label`)  
(SELECT MAX(id) FROM bug WHERE project_id = 1,  
    '1',  
    'Un bug'  
from  `bug`);


---------------
il n'y a pas que le VTT dans la vie, il y a le Snowboard aussi ...
Reply

Marsh Posté le 25-05-2009 à 10:41:07    

le moyen le plus propre que je vois pour gérer ça, c'est de mettre en place un trigger  ( declencheur)


---------------

Reply

Marsh Posté le 25-05-2009 à 10:49:47    

vttman2> il y a effectivement des petits souci niveau syntaxique ;)
 
flo850> va falloir que je me renseigne sur comment les trigger marchent.
 
Merci pour vos aides

Reply

Marsh Posté le 25-05-2009 à 10:53:12    

J'ai trouvé ce site avec plein d'info/tuto sur MySQL: http://www.mysqltutorial.org/
 
Je vais essayé de lire ça cette semaine (soir et WE vu que c'est un projet perso </mylife> )

Reply

Marsh Posté le 25-05-2009 à 11:15:10    

Si les sequences existent pas niveau mysql
alors effectivement se pencher vers triggers (déclencheurs)


---------------
il n'y a pas que le VTT dans la vie, il y a le Snowboard aussi ...
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed