2012-04-25 11 views
15

काम नहीं करता है मैं "DROP TABLE" कमांड के साथ कुछ टेबल छोड़ने की कोशिश कर रहा हूं लेकिन अज्ञात कारण के लिए, प्रोग्राम बस "बैठता है" और उस तालिका को हटा नहीं देता जिसे मैं डेटाबेस में चाहता हूं । बिल और Bill_Productsपोस्टग्रेस्क्ल ड्रॉप टेबल

उत्पाद है, जो बिल में उत्पादों संदर्भित करने के लिए प्रयोग किया जाता है:

मैं डेटाबेस में 3 टेबल है।

मैं उत्पाद को हटाने/छोड़ने में कामयाब रहा, लेकिन मैं बिल और बिल_Products के लिए ऐसा नहीं कर सकता। मैं वही "DROP TABLE Bill CASCADE;" कमांड जारी कर रहा हूं लेकिन कमांड लाइन केवल स्टालों को जारी कर रही है। मैंने CASCADE विकल्प के बिना सरल संस्करण का भी उपयोग किया है।

क्या आपको कोई विचार है कि यह क्यों हो रहा है?

अद्यतन:

मैं सोच रहा है कि यह संभव है डेटाबेस के बिल के लिए उत्पादों से कुछ संदर्भों रखने के लिए और शायद यही कारण है कि यह विधेयक तालिका नहीं हटेंगे है के लिए।

तो, इस मामले के लिए मैंने एक साधारण SELECT * from Bill_Products जारी किया और कुछ (10-15) सेकंड (अजीब बात यह है कि, क्योंकि मुझे नहीं लगता कि यह खाली है जब खाली टेबल होने पर इतने लंबे समय तक चलना सामान्य है) तालिका और इसकी सामग्री मुद्रित, जो कोई नहीं हैं। (इसलिए स्पष्ट रूप से उत्पाद से बिल तक कोई संदर्भ नहीं छोड़े गए हैं)।

+0

कैस्केड नहीं करने के बारे में क्या। शायद बाधा अब गायब उत्पाद – Randy

+0

का जिक्र कर रही थी, इसके बिना भी कोशिश की गई, लेकिन कोई प्रभाव नहीं पड़ा। –

+1

"कमांड लाइन सिर्फ स्टाल" इसका क्या अर्थ है? 'psql' दुर्घटनाओं, लटका, या जम जाता है? क्या आपको इसे मारना है? Ctrl-C क्या करता है? मुझे लगता है कि मैं सिर्फ 'स्टालों' को परिभाषित कर रहा हूं। या आप psql का उपयोग नहीं कर रहे हैं? – alan

उत्तर

26

क्या

SELECT * 
    FROM pg_locks l 
    JOIN pg_class t ON l.relation = t.oid AND t.relkind = 'r' 
WHERE t.relname = 'Bill'; 

के उत्पादन में यह हो सकता है समानांतर में अपनी मेज का उपयोग अन्य सत्र वहाँ हो और आप इसे छोड़ने के लिए Access Exclusive ताला प्राप्त नहीं कर सकता है।

+1

'psdemo => चयन * pg_locks से l l.relation = t.oid पर pg_class t में शामिल हों और t.relkind = 'r' जहां t.relname =" ps_bill "; त्रुटि: कॉलम "ps_bill" मौजूद नहीं है लाइन 1: ... ation = t.oid और t.relkind = 'r' जहां t.relname = "ps_bill"; ' –

+0

एक शाब्दिक मान के लिए, एकल उद्धरण का उपयोग करें (एस्ट्रोफ़े)। PostgreSQL एक * पहचानकर्ता * लपेटने के रूप में डबल कोट्स के इलाज में एसक्यूएल मानक के अनुरूप है। – kgrittn

+2

धन्यवाद लेकिन मैं इसे एक साधारण रीबूट के साथ ठीक करने में कामयाब रहा। यह एक मूर्खतापूर्ण और एक demystifying बात नहीं है, मैंने क्या किया, लेकिन यह समस्या के आसपास सबसे छोटा रास्ता था। मैंने आपके जवाब को वोट दिया ताकि आप जान सकें कि मैं आपकी मदद की सराहना करता हूं। मुझे लगता है कि वास्तव में एक लेनदेन था जो टेबल पर ताला लगा था। –

4

एक ही समस्या थी।

तालिका में कोई ताले नहीं थे।

रीबूट मदद की।

+0

मेरे लिए वही बात। मुझे रीबूट करने की ज़रूरत नहीं थी, केवल पोस्टग्रेस्क्ल को पुनरारंभ करना पड़ा। –

+0

वही यहाँ। मुझे – anvd

5

तो मैं दीवार कुछ घंटों के लिए ही इस मुद्दे को हल करने की कोशिश कर, और यहाँ के खिलाफ मेरे सिर मार रहा था समाधान है कि मेरे लिए काम किया है:

जांच करें कि PostgreSQL है एक लंबित तैयार लेनदेन है कि प्रतिबद्ध कभी नहीं किया गया या वापस लुढ़का:

+०१२३५१६४१०६:

SELECT database, gid FROM pg_prepared_xacts; 

आप एक परिणाम मिलता है, तो प्रत्येक लेनदेन के लिए gid आप एक ROLLBACK डेटाबेस से समस्या हो रही पर अमल करना चाहिए

ROLLBACK PREPARED 'the_gid'; 

अधिक जानकारी के लिए, click here

3

बस

SELECT pid, relname 
FROM pg_locks l 
JOIN pg_class t ON l.relation = t.oid AND t.relkind = 'r' 
WHERE t.relname = 'Bill'; 

करना और कहाँ 1234 क्वेरी परिणामों से अपने वास्तविक पीआईडी ​​है तब तक

kill 1234 

हर पीआईडी ​​मार डालते हैं।

आप पाइप कर सकते हैं यह सब एक साथ इस तरह (ताकि आप कॉपी-पेस्ट करने के लिए हर मैन्युअल पीआईडी ​​नहीं है):

psql -c "SELECT pid FROM pg_locks l 
    JOIN pg_class t ON l.relation = t.oid AND t.relkind = 'r' 
    WHERE t.relname = 'Bill';" | tail -n +3 | head -n -2 | xargs kill 
+0

रीबूट करने की आवश्यकता है, भले ही मैं प्रश्न पोस्ट करने के 3 साल से अधिक हो, मैं आपके समाधान को आने और साझा करने के लिए धन्यवाद देना चाहता हूं। लेकिन, मेरा सवाल यह है कि 'relname' क्या होगा? –

+1

@RaduGheorghiu relname वास्तव में एक टेबल नाम है। – chemikadze

0

पुराना सवाल लेकिन वही समस्या का सामना किया। डेटाबेस को रीबूट नहीं किया जा सका, इस अनुक्रम तक काम करने तक कुछ चीजों का परीक्षण किया:

  • truncate table foo;
  • ड्रॉप इंडेक्स समवर्ती रूप से foo_something; समय 4-5x
  • तालिका तालिका ड्रॉप ड्रॉप कॉलम जो भी_foreign_key; समय 3x
  • तालिका तालिका ड्रॉप ड्रॉप आईडी बदलें;
  • ड्रॉप टेबल foo;
संबंधित मुद्दे