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

ORA-00933:एक ही समय में दो तालिकाओं को हटाते समय SQL कमांड ठीक से समाप्त नहीं हुआ

आप एक स्टेटमेंट में दो टेबल से डिलीट नहीं कर सकते - insert all . के बराबर कोई डिलीट नहीं है . (जब तक कि आपके पास ऐसी बाधाएँ न हों जो डिलीट को कैस्केड करती हैं, या ऐसा ट्रिगर जो मैन्युअल रूप से करता है)। दस्तावेज दिखाता है कि आपका सिंटैक्स मान्य नहीं है, क्योंकि एक से अधिक तालिका निर्दिष्ट करने का कोई पथ नहीं है।

आपको पहले चाइल्ड टेबल से रिकॉर्ड्स को हटाने के लिए दो डिलीट स्टेटमेंट्स की आवश्यकता होगी:

  DELETE FROM login 
  WHERE login.id_user_login = p_id_user;
  DELETE FROM users
  WHERE users.id_user = p_id_user;

आप कर सकते थे अपनी विदेशी कुंजी बाधा को delete cascade . में बदलें :

alter table login add constraint login_fk_user foreign key (id_user_login)
references users(id_user) on delete cascade;

... जिसका अर्थ यह होगा कि आपको केवल users . से स्पष्ट रूप से हटाना होगा मेज़; लेकिन यह वास्तव में वह नहीं हो सकता है जो आप चाहते हैं, क्योंकि यह एक स्तर के सत्यापन को हटा देता है - यदि आप बच्चे हैं तो आप मूल कुंजी को गलती से हटा देना चाहते हैं। दो डिलीट जारी करना वास्तव में यहां चोट नहीं पहुंचाता है।

संयोग से, आपकी पहली प्रक्रिया प्रतिबद्ध नहीं है, जिसकी आप अपेक्षा कर रहे होंगे। इस पंक्ति में:

    ...
    SELECT * FROM DUAL COMMIT;

... COMMIT DUAL . के लिए एक उपनाम के रूप में व्याख्या की गई है तालिका, एक अलग आदेश नहीं। DUAL . के बाद आपको एक अर्धविराम की आवश्यकता होगी , और अधिमानतः COMMIT; . के लिए एक नई लाइन . लेकिन आमतौर पर इसे बेहतर नहीं माना जाता है एक प्रक्रिया में प्रतिबद्ध होने के लिए, और शीर्ष-स्तरीय कॉलर को यह तय करने दें कि डेटा अखंडता को बनाए रखने के लिए प्रतिबद्ध या रोल बैक करना है या नहीं।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. वर्णों के समूह को दोहराने के लिए Oracle डेटाबेस Regex

  2. Oracle के लिए मुफ्त डेस्कटॉप क्लाइंट?

  3. पीएल/एसक्यूएल:स्पष्ट कर्सर को रेफरी कर्सर में कनवर्ट करें?

  4. TO_CHAR(संख्या) Oracle में कार्य

  5. मैं कीबोर्ड से जो टाइप करता हूं वह अनावश्यक रूप से rlwrap इकोस क्यों करता है?