आप इसे एक एकल SQL कथन के साथ कर सकते हैं:
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
केवल पंक्ति लौटाता है यदि वह पहले से मौजूद नहीं है, इसलिए इसे केवल इस मामले में डाला जाएगा।
बल्क इंसर्ट के लिए समाधान
यदि आपके पास एक बार में डालने के लिए व्यंजनों की एक लंबी सूची है, तो आप:
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;
एक बार में मुट्ठी भर डालने का समाधान
जैसा कि माइक ने टिप्पणी की थी, अस्थायी तालिका केवल कुछ रिकॉर्ड के लिए एक ओवरकिल होगी।
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;