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

रिटर्निंग त्रुटि का कारण बनता है:तालिका के लिए FROM-क्लॉज प्रविष्टि गुम है

यह सच है, जैसा कि नोट किया गया है, कि RETURNING एक INSERT . का खंड केवल सम्मिलित पंक्ति देखता है। अधिक विशेष रूप से, मैन्युअल को यहां उद्धृत करना ए> :

बोल्ड मेरा जोर है।
तो कुछ भी आपको सहसंबंधित सबक्वेरी . जोड़ने से रोकता है RETURNING . पर सूची:

INSERT INTO employees.password_resets AS ep
       (empl_pwd_reset_uuid                  , empl_user_pvt_uuid                    , t_valid                     , for_empl_user_pvt_uuid, token)
SELECT 'f70a0346-a077-11eb-bd1a-aaaaaaaaaaaa', '6efc2b7a-f27e-11ea-b66c-de1c405de048', '2021-04-18 19:57:47.111365', eu.empl_user_pvt_uuid , '19d65aea-7c4a-41bc-b580-9d047f1503e6'
FROM   employees.users eu
WHERE  empl_user_pub_uuid = 'e2bb39f1f28011eab66c63cb4d9c7a34'
RETURNING for_empl_user_pvt_uuid AS empl_user_pvt_uuid  -- alias to meet your org. query
        , (SELECT email
           FROM   employees.emails
           WHERE  empl_user_pvt_uuid = ep.empl_user_pvt_uuid
           ORDER  BY t DESC  -- NULLS LAST ?
           LIMIT  1
          ) AS email
        , (SELECT name_first
           FROM   employees.profiles
           WHERE  empl_user_pvt_uuid = ep.empl_user_pvt_uuid
           -- ORDER  BY ???
           LIMIT  1
          ) AS name_first;

यह बहुत अधिक कुशल . भी है कई कारणों से आपके पास (या क्या प्रस्तावित किया गया था) क्वेरी की तुलना में।

साथ ही, संभवतः सबसे महत्वपूर्ण, यह सही है . हम उस पंक्ति के डेटा का उपयोग करते हैं जिसे वास्तव में डाला गया है - बाद इसे डालने। (शीर्ष पर उद्धरण देखें!) संभावित डिफ़ॉल्ट मानों के बाद, ट्रिगर या नियम लागू किए गए हैं। हम निश्चित हो सकते हैं कि जो हम देखते हैं वह वास्तव में डेटाबेस में है (वर्तमान में)।

आपके पास कोई ORDER BY नहीं है profiles.name_first . के लिए . यह सही नहीं है। या तो केवल एक क्वालिफाइंग पंक्ति है, तो हमें DISTINCT की आवश्यकता नहीं है न ही LIMIT 1 . या कई हो सकते हैं, तो हमें एक नियतात्मक ORDER BY . की भी आवश्यकता है नियतात्मक परिणाम प्राप्त करने के लिए।

और अगर emails.t NULL हो सकता है, आप NULLS LAST जोड़ना चाहेंगे ORDER BY . में खंड। देखें:

सूचकांक

आदर्श रूप से, आपके पास ये बहु-स्तंभ अनुक्रमणिकाएँ हैं (इस क्रम में स्तंभों के साथ):

  • users (empl_user_pub_uuid, empl_user_pvt_uuid)
  • emails (empl_user_pvt_uuid, email)
  • profiles (empl_user_pvt_uuid, name_first)

फिर, यदि तालिकाओं को पर्याप्त रूप से वैक्यूम किया जाता है, तो आपको केवल तीन इंडेक्स स्कैन मिलते हैं और पूरा ऑपरेशन तेजी से हल्का हो रहा है।

पूर्व प्राप्त करें-INSERT मान?

अगर आप वाकई ऐसा चाहते हैं (जो मुझे नहीं लगता कि आप ऐसा करते हैं), तो इस पर विचार करें:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. संबंधों में TypeORM OneToMany फ़िल्टर परिणाम पर प्रभाव नहीं डालता

  2. 64 बिट पायथन और ओडीबीसी ड्राइवर के साथ 32 बिट .एमडीबी से कैसे पढ़ा जाए?

  3. psql.exe कैसे शुरू करें

  4. PostgreSQL में इंटरवल ट्री को स्टोर करना और क्वेरी करना

  5. PostgreSQL में तालिकाओं के आंकड़े डेटा को मैन्युअल रूप से कैसे अपडेट करें