tags:

views:

82

answers:

2

I have a table connecting principals to their roles. I have come upon a situation where I need to add a role for each user. I have a statement SELECT id FROM principals which grabs a list of all the principals. What I want to create is something like the following:

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

so for each principal, it creates a new record with a role_id=1. I have very little SQL experience, so I dont know if I can do this as simply as I would like to or if there is some sort of loop feature in SQL that I could use.

Also, this is for a mySQL db (if that matters)

+10  A: 

Use VALUES keyword if you want to insert values directly. Omit it to use any SELECT (where column count and type matches) to get the values from.

INSERT INTO role_principal(principal_id,role_id)
    (SELECT id, 1 FROM principals);
Peter Lang
When using INSERT . . . SELECT on most SQL systems, you omit the parens around the SELECT statement. I think it's the same in MySQL, but not 100% sure.
Larry Lustig
I replaced 1 with (SELECT id FROM roles WHERE...) so that it could work for any role. But thank you for guiding me down the right path.
UmYeah
+1  A: 

To avoid duplicates is useful to add a subquery :

INSERT INTO role_principal(principal_id,role_id) (SELECT id, 1 FROM principals p WHERE NOT EXISTS (SELECT * FROM role_principal rp WHERE rp.principal_id=p.id AND role_id=1) )

Lluis Martinez
Thanks for the additional answer. I know in my specific situation I wont have any duplicates but it is certainly good to know how I would handle that situation.
UmYeah