Bạn có thể làm điều đó với một câu lệnh SQL duy nhất:
INSERT INTO user_recipe
SELECT new_UserId, new_RecipeId
FROM user_recipe
WHERE NOT EXISTS (
SELECT *
FROM user_recipe
WHERE (UserId, RecipeId) = (new_UserId, new_RecipeId)
);
SELECT
chỉ trả về hàng nếu nó chưa tồn tại, vì vậy nó sẽ chỉ được chèn trong trường hợp này.
Giải pháp cho chèn hàng loạt
Nếu bạn có một danh sách dài các công thức để chèn cùng một lúc, bạn có thể:
CREATE TEMP TABLE i(userId int, recipeid int) ON COMMIT DROP;
INSERT INTO i VALUES
(1,2), (2,4), (2,4), (2,7), (2,43), (23,113), (223,133);
INSERT INTO user_recipe
SELECT DISTINCT i.* -- remove dupes from the insert candidates themselves
FROM i
LEFT JOIN user_recipe u USING (userid, recipeid)
WHERE u.userid IS NULL;
Giải pháp để chèn một số ít cùng một lúc
Bảng tạm thời sẽ là quá mức cần thiết cho chỉ một vài bản ghi, như Mike đã nhận xét.
INSERT INTO user_recipe
SELECT i.*
FROM (
SELECT DISTINCT * -- only if you need to remove possible dupes
FROM (
VALUES (1::int, 2::int)
,(2, 3)
,(2, 4)
,(2, 4) -- dupe will be removed
,(2, 43)
,(23, 113)
,(223, 133)
) i(userid, recipeid)
) i
LEFT JOIN user_recipe u USING (userid, recipeid)
WHERE u.userid IS NULL;