Удаление таблицы в PostgreSQL без удаления связанной последовательности - PullRequest
12 голосов
/ 01 декабря 2010

У меня есть стол, foo. В целях быстрого обновления / развертывания моего сайта я создал новую таблицу, tmp_foo, для хранения некоторых новых данных, выполнив:

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

Теперь у каждой таблицы есть столбец PK id, который выглядит следующим образом:

   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, а исходный foo стал foo_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)

1 Ответ

27 голосов
/ 01 декабря 2010

Попробуйте это:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...