2010-01-13 5 views
1

J'ai une table qui relie les principaux à leurs rôles. Je suis arrivé à une situation où j'ai besoin d'ajouter un rôle pour chaque utilisateur. J'ai une déclaration SELECT id FROM principals qui saisit une liste de tous les principaux. Ce que je veux créer quelque chose comme ce qui suit:Insertion SQL complexe/simple: ajout de plusieurs lignes

 
INSERT INTO role_principal(principal_id,role_id) 
VALUES(SELECT id FROM principals, '1'); 

donc pour chaque mandant, il crée un nouveau record avec un role_id = 1. J'ai très peu d'expérience SQL, donc je ne sais pas si je peux le faire aussi simplement que je le voudrais ou s'il y a une sorte de fonctionnalité de boucle en SQL que je pourrais utiliser.

En outre, c'est une base de données mysql (si cela importe)

+0

En relation: http://stackoverflow.com/questions/1189810/mysql-5-1-35-select-into-not-working –

+2

Veuillez arrêter de penser en termes de boucle, la boucle est mauvaise sur les bases de données, penser interms d'affecter des ensembles de da ta à la place. – HLGEM

Répondre

10

Utilisez mot-clé VALUES si vous souhaitez insérer des valeurs directement. Omettez-le pour utiliser SELECT (où le nombre de colonnes et le type correspondent) pour obtenir les valeurs.

INSERT INTO role_principal(principal_id,role_id) 
    (SELECT id, 1 FROM principals); 
+1

Lors de l'utilisation de INSERT. . . SELECT sur la plupart des systèmes SQL, vous omettez les parenthèses autour de l'instruction SELECT. Je pense que c'est la même chose en MySQL, mais pas sûr à 100%. –

+0

J'ai remplacé 1 avec (SELECT id FROM rôles WHERE ...) afin qu'il puisse fonctionner pour n'importe quel rôle. Mais merci de me guider sur le bon chemin. – UmYeah

1

Pour éviter les doublons est utile d'ajouter un sous-requête:

INSERT INTO role_principal (principal_id, role_id) (SELECT id, 1 directions d'école p OÙ EXISTE PAS (SELECT * FROM rp role_principal OÙ rp.principal_id = p.id AND role_id = 1) )

+0

Merci pour la réponse supplémentaire. Je sais que dans ma situation spécifique, je n'ai pas de doublons, mais il est certainement bon de savoir comment je gérerais cette situation. – UmYeah

Questions connexes