Удаление таблицы в PostgreSQL без удаления связанной с ней последовательности

У меня есть стол, 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)


person Alison R.    schedule 01.12.2010    source источник


Ответы (1)


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

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)
person a_horse_with_no_name    schedule 01.12.2010
comment
Ага. Это сработало. (На самом деле, поскольку я был параноиком, я сделал новую таблицу владельцем, а не ни одной.) Вы случайно не знаете, как проверить владельца последовательности? \d этого не показывает, и select * from foo_id_seq тоже. - person Alison R.; 02.12.2010