2010-10-14 4 views
0

J'ai créé le code suivant pour insérer dans deux tables Users et Roles:Aide pour la résolution d'un problème dans une affectation SQL Server

- à insérer dans la table des utilisateurs

declare @u int 
set @u = 1000 

while @u <= 1200 
begin 
    insert into Users(UserID, Username, [Password], Email) 
    values(@u, 
     'Username'+CAST(@u as varchar(4)), 
     'pass'+CAST(@u as varchar(4)), 
     'Email'+CAST(@u as varchar(4))) 

    set @u = @u + 1 
end 
--to insert into the Roles table 
declare @a int 
set @a = 1 

while @a <= 100 
begin 
    insert into Roles (RoleID, [Role], [Description]) 
    values(@a, 'Admin', 'description’ + CAST(@a as varchar(4))) 

    set @a = @a + 1 
end 

maintenant Je veux faire la même chose pour une table nommée 'User_Roles', qui a deux clés étrangères de Users et une autre de Roles. Je l'ai écrit ce qui suit:

declare @b int 
set @b = 1 

while @b <= 300 
begin 
    insert into User_Roles(UserID, RoleID, [Description]) 
    select 
     UserID, RoleID, 'Description' + CAST(@b as varchar(4)) 
    from Users, Roles 
    where UserID = CAST((RAND()*200+1000) as int) 
     and RoleID = CAST((RAND()*99+1)as int) 

    set @b = @b + 1 
end 

Les deux premiers code sera exécuté correctement, mais le dernier provoque une erreur car il insérer des valeurs en double dans la clé primaire. Comment puis-je changer la dernière partie et résoudre ce problème?

+0

Pourquoi avez-vous une colonne 'description' dans votre table de jonction? Normalement, une table de jonction ne contient que les PK des deux tables impliquées dans la relation plusieurs-à-plusieurs. –

Répondre

0

Modifiez votre instruction INSERT pour inclure un GROUP BY afin d'éliminer les doublons UserID et RoleID.

insert into User_Roles(UserID, RoleID,[Description]) 
    select UserID, RoleID,'Description'+CAST(@b as varchar(4)) 
    from Users, Roles 
    where UserID = CAST((RAND()*200+1000) as int) 
    and RoleID = CAST((RAND()*99+1)as int) 
    GROUP BY UserID, RoleID 
+0

Je l'ai fait, mais cela n'a pas aidé mon problème, il y a toujours des doublons dans ma clé primaire! – elton

+0

@elton: pourquoi utilisez-vous 'RAND()'? –

0

Chaque fois que vous parcourez la boucle, vous devez vous assurer que vous insérez une valeur qui n'existe pas déjà.

Untested, mais quelque chose comme cela devrait fonctionner:

insert into User_Roles(UserID, RoleID, [Description]) 
    select 
     u.UserID, r.RoleID, 'Description' + CAST(@b as varchar(4)) 
    from Users u, Roles r 
    where u.UserID = CAST((RAND()*200+1000) as int) 
     and r.RoleID = CAST((RAND()*99+1)as int) 
     and NOT EXISTS(SELECT 1 from User_Roles ur WHERE ur.UserID = u.UserID AND ur.RoleId = r.RoleId)