मान लें कि id_pracownika
PRIMARY KEY
है तालिका के। या कम से कम परिभाषित UNIQUE
. (यदि यह NOT NULL
, NULL एक कॉर्नर केस है।)
SELECT
या INSERT
आपका कार्य "SELECT या INSERT" का एक और कार्यान्वयन है - UPSERT
. का एक प्रकार समस्या है, जो समवर्ती लेखन भार के मुकाबले अधिक जटिल है, जितना यह लग सकता है। देखें:
- क्या किसी ऐसे फंक्शन में SELECT या INSERT है जो दौड़ की स्थिति से ग्रस्त है?
यूपीएसईआरटी के साथ पोस्टग्रेज 9.5 या बाद के संस्करण में
Postgres 9.5 या बाद के संस्करण में UPSERT (INSERT ... ON CONFLICT ...
का उपयोग करें) ) पोस्टग्रेज विकी में विवरण। यह नया सिंटैक्स साफ़ कार्य करता है :
CREATE OR REPLACE FUNCTION hire(
_id_pracownika integer
, _imie varchar
, _nazwisko varchar
, _miasto varchar
, _pensja real)
RETURNS text
LANGUAGE plpgsql AS
$func$
BEGIN
INSERT INTO pracownicy
( id_pracownika, imie, nazwisko, miasto, pensja)
VALUES (_id_pracownika,_imie,_nazwisko,_miasto,_pensja);
ON CONFLICT DO NOTHING
RETURNING 'OK';
IF NOT FOUND THEN
RETURN 'JUZ ISTNIEJE';
END IF;
END
$func$;
तालिका-अर्हता स्तंभ नाम जहां आवश्यक हो, असंबद्ध करने के लिए। (आप फ़ंक्शन नाम के साथ फ़ंक्शन पैरामीटर भी उपसर्ग कर सकते हैं, लेकिन यह आसानी से अजीब हो जाता है।)
लेकिन INSERT
की लक्ष्य सूची में कॉलम नाम तालिका-योग्य नहीं हो सकता है। (वैसे भी अस्पष्ट नहीं।)
इस तरह की अस्पष्टताओं को प्राथमिकता से सबसे अच्छा बचें, यह कम त्रुटि प्रवण है। कुछ (मेरे सहित) सभी फ़ंक्शन पैरामीटर और वेरिएबल को अंडरस्कोर के साथ प्रीफ़िक्स करके ऐसा करना पसंद करते हैं।
अगर आपको सकारात्मक रूप से जरूरत . है फ़ंक्शन पैरामीटर नाम के रूप में एक कॉलम नाम भी, नामकरण टकराव से बचने का एक तरीका ALIAS
का उपयोग करना है समारोह के अंदर। दुर्लभ मामलों में से एक जहां ALIAS
वास्तव में उपयोगी है।
या सामान्य स्थिति के आधार पर फ़ंक्शन पैरामीटर का संदर्भ दें:$1
id_pracownika
. के लिए इस मामले में।
अगर बाकी सब विफल हो जाता है, तो आप #variable_conflict
सेट करके तय कर सकते हैं कि क्या प्राथमिकता है . देखें:
- फ़ंक्शन पैरामीटर और USING क्लॉज़ के साथ JOIN के परिणाम के बीच विरोध का नामकरण
और भी है:
-
RETURNING
. में पेचीदगियां हैं एक यूपीएसईआरटी में खंड। देखें:- PostgreSQL में ON CONFLICT के साथ RETURNING का उपयोग कैसे करें?
-
स्ट्रिंग अक्षर (पाठ स्थिरांक) को सिंगल कोट्स में संलग्न किया जाना चाहिए:'ओके', न कि <स्ट्राइक>
"OK"
स्ट्राइक> . देखें:- पोस्टग्रेएसक्यूएल में सिंगल कोट्स के साथ टेक्स्ट डालें
-
अन्य प्रोग्रामिंग भाषाओं की तुलना में चर निर्दिष्ट करना तुलनात्मक रूप से अधिक महंगा है। plpgsql में सर्वश्रेष्ठ प्रदर्शन के लिए असाइनमेंट को न्यूनतम रखें। जितना हो सके सीधे SQL स्टेटमेंट में करें।
-
VOLATILE COST 100
कार्यों के लिए डिफ़ॉल्ट सज्जाकार हैं। उन्हें बताने की जरूरत नहीं है।
पोस्टग्रेज 9.4 या पुराने में यूपीएसईआरटी के बिना
...
IF EXISTS (SELECT FROM pracownicy p
WHERE p.id_pracownika = hire.id_pracownika) THEN
RETURN 'JUZ ISTNIEJE';
ELSE
INSERT INTO pracownicy(id_pracownika,imie,nazwisko,miasto,pensja)
VALUES (hire.id_pracownika,hire.imie,hire.nazwisko,hire.miasto,hire.pensja);
RETURN 'OK';
END IF;
...
एक EXISTS
में अभिव्यक्ति, SELECT
सूची कोई फर्क नहीं पड़ता। SELECT id_pracownika
, SELECT 1
, या यहां तक कि SELECT 1/0
- सब एक जैसे। बस एक खाली SELECT
का उपयोग करें सूची। केवल किसी भी योग्यता पंक्ति का अस्तित्व मायने रखता है। देखें:
- EXISTS सबक्वेरी में क्या पढ़ना आसान है?