PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

पीएल/पीजीएसक्यूएल कॉलम नाम वैरिएबल के समान है

मान लें कि 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 सबक्वेरी में क्या पढ़ना आसान है?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. AWS RDS का उपयोग करके PostgreSQL डेटाबेस को ऑन-प्रेम से क्लाउड में माइग्रेट करना

  2. Django+Postgres:वर्तमान लेनदेन निरस्त कर दिया गया है, लेनदेन ब्लॉक के अंत तक आदेशों को अनदेखा कर दिया गया है

  3. PostgreSQL पर संकेत

  4. SQL सर्वर में CROSS APPLY के अनुरूप पोस्टग्रेज करता है

  5. विशेषता `डीज़ल ::एक्सप्रेशन` को `बिगडेसिमल ::बिगडेसिमल` के लिए लागू नहीं किया गया है