There are 3 problems .
JOIN phones groups, CROSS JOIN, , , . , . 100 100 , 10 000 .
(group_id, phone_name)
group_phones.
, :
INSERT INTO group_phones(group_id, phone_name)
SELECT i.id, i.name
FROM (
SELECT DISTINCT g.id, p.name
FROM phones p
JOIN groups g ON ??how are p & g connected??
WHERE g.id IN ($add_groups)
AND p.name IN ($phones)
) i
LEFT JOIN group_phones gp ON (gp.group_id, gp.phone_name) = (i.id, i.name)
WHERE gp.group_id IS NULL
Concurrency
. , . , - ( ) .
BEGIN ISOLATION LEVEL SERIALIZABLE;
INSERT ...
COMMIT;
, .
: @depesz SO.
, .
LEFT JOIN tbl ON right_col = left_col WHERE right_col IS NULL
, . ( ),
WHERE NOT EXISTS (SELECT 1 FROM tbl WHERE right_col = left_col)
, , .
IN, @dezso, PostgreSQL.