2010-12-01 12 views
9

मेरे पास एक तालिका है, fooसंबंधित अनुक्रम को हटाए बिना PostgreSQL में एक तालिका को हटाकर

:

create table tmp_foo (like foo including constraints including defaults including indexes); 

अब हर तालिका एक पी id स्तंभ की तरह लग रहा है: एक त्वरित उन्नयन के प्रयोजनों के लिए/मेरी साइट के तैनात, मैं एक नया टेबल, tmp_foo, कुछ नए डेटा शामिल होने की कर रही द्वारा किए गए

Column |   Type   |        Modifiers         
-------------+-----------------------+-------------------------------------------------------------------------- 
id   | integer    | not null default nextval('foo_id_seq'::regclass) 

महत्वपूर्ण बिंदु यह है कि दोनों टेबल सटीक समान अनुक्रम पर निर्भर हैं, foo_id_seq। कोई tmp_foo_id_seq नहीं है। यह मेरे उद्देश्यों के लिए ठीक लगता है।

इस के बाद, मैं नए डेटा से tmp_foo भरी हुई और तालिकाओं नाम दिया ताकि tmp_foo असली foo के रूप में पदभार संभाल लिया है, और मूल foofoo_old बन गया। अब मैं foo_old ड्रॉप करने का प्रयास करें:

db=> drop table foo_old ; 
ERROR: cannot drop table foo_old because other objects depend on it 
DETAIL: default for table foo_old column id depends on sequence foo_id_seq 

पर्याप्त मेला, id स्तंभ डिफ़ॉल्ट अभी भी क्रम पर निर्भर करता है।

db=> alter table foo_old alter column id drop default; 

यहां किकर है।

db=> drop table foo_old ; 
ERROR: cannot drop table foo_old because other objects depend on it 
DETAIL: default for table foo column id depends on sequence foo_id_seq 

तो foo_old अब क्रम पर कोई दिखाई निर्भरता है, फिर भी यह अभी भी तालिका के साथ अनुक्रम ड्रॉप करने की कोशिश करता है (और स्पष्ट रूप से होगा क्योंकि नई तालिका इस पर निर्भर नहीं)।

  1. क्यों अनुक्रम अभी भी जुड़ा हुआ है वर्ष की मेज के साथ :

    तो सवाल यह दो भाग है?

  2. क्या इस तरह के आसपास कोई शामिल नहीं है जिसमें नई तालिका पर नए या अलग अनुक्रम पर निर्भर करती है (यदि भी मदद करेगा)?

(PostgreSQL 8.4 पर)

उत्तर

19

इस प्रयास करें:

 
ALTER SEQUENCE foo_id_seq OWNED BY NONE 

तो आप तालिका ड्रॉप करने में सक्षम होना चाहिए।

प्राप्त करने के लिए एक दृश्य के "मालिक" का उपयोग निम्न क्वेरी

 
SELECT s.relname as sequence_name, 
     n.nspname as sequence_schema, 
     t.relname as related_table, 
     a.attname as related_column 
    FROM pg_class s, pg_depend d, pg_class t, pg_attribute a, pg_namespace n 
    WHERE s.relkind  = 'S' 
    AND n.oid   = s.relnamespace 
    AND d.objid  = s.oid 
    AND d.refobjid = t.oid 
    AND (d.refobjid, d.refobjsubid) = (a.attrelid, a.attnum) 
+1

अहा। वह काम किया। (दरअसल, जब से मैं पागल था, मैंने किसी भी जगह के बजाय मालिक को नई टेबल बनाई।) क्या आपको पता है कि अनुक्रम के मालिक का निरीक्षण कैसे किया जाए? '\ d' इसे नहीं दिखाता है और 'foo_id_seq' से * चुनें, या तो नहीं। –

+0

मुझे नहीं पता कि टिप्पणियों में SQL कथन को सही तरीके से कैसे प्रारूपित किया जाए, इसलिए मैंने अपने उत्तर में कथन जोड़ा –