ऐसा मत करो! कभी भी ! ऐसा करने के बारे में सोचें भी नहीं!
यह गलत समाधान आपके लिए कारगर प्रतीत हो सकता है (यह नहीं है):
INSERT INTO lists VALUES ((SELECT max(id)+1 FROM lists),'KO','SPH', '5');
लेकिन , यदि कोई आपके जैसे ही समय डालने का प्रयास करता है, तो आप दोनों को एक ही id
मिलेगा , जो एक अमान्य परिणाम देगा। आपको वास्तव में एक sequence
का उपयोग करना चाहिए या कुछ और विश्वसनीय तंत्र (एक सहायक तालिका सामान्य है जब आपके पास अनुक्रम में छेद नहीं हो सकते हैं, लेकिन इसमें कुछ कमियां हैं [यह लॉक हो जाएगा])। आप serial
. का भी उपयोग कर सकते हैं इसे आसान बनाने के लिए डेटा प्रकार (यह नीचे एक क्रम बनाता है):
CREATE TABLE lists(id serial, col2 text, col3 text, ...);
-- If you don't specify "id", it will autogenerate for you:
INSERT INTO lists(col2, col3, ...) VALUES('KO','SPH', ...);
-- You can also specify using DEFAULT (the same as above):
INSERT INTO lists(id, col2, col3, ...) VALUES(DEFAULT, 'KO','SPH', ...);
यदि आप वास्तव में, वास्तव में, अनुक्रम नहीं बना सकते हैं और उसका उपयोग नहीं कर सकते हैं, तो आप उपरोक्त के रूप में कर सकते हैं, लेकिन आपको अपवाद को संभालना होगा (id
मानते हुए) फ़ील्ड पीके या यूके है, और एक पठित प्रतिबद्ध लेनदेन का उपयोग करके), ऐसा कुछ (पीएल/पीजीएसक्यूएल में):
DECLARE
inserted bool = false;
BEGIN
WHILE NOT inserted LOOP;
BEGIN
INSERT INTO lists
VALUES ((SELECT coalesce(max(id),0)+1 FROM lists),'KO','SPH', '5');
inserted = true;
EXCEPTION
WHEN unique_violation THEN
NULL; -- do nothing, just try again
END;
END LOOP;
END;
लेकिन फिर से, मैं आपको इससे बचने की अत्यधिक सलाह देता हूं:अनुक्रम का उपयोग करें और खुश रहें... =D
साथ ही, मुझे पता है कि यह एक उदाहरण है, लेकिन INSERT INTO
. पर स्पष्ट कॉलम सूची का उपयोग करें खंड।