2010-12-01 2 views
9

테이블이 foo입니다.관련된 시퀀스를 삭제하지 않고 PostgreSQL에서 테이블 삭제

을 :

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

이제 각 테이블처럼 보이는 PK 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. 새 테이블을 를 포함하지 않는이 주변에 어떤 방법은 거기 신규 또는 다른 순서 (있는 경우 그 것조차 도움)에 따라인가?

답변

19

(PostgreSQL을 8.4 일)이 시도 :

 
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'는 그것을 표시하지 않고'select * from foo_id_seq'도하지 않습니다. –

+0

코멘트에서 SQL 문 형식을 올바르게 지정하는 방법을 모르겠으므로이 문을 내 대답에 추가했습니다. –