У меня есть стол, 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
больше не имеет видимой зависимости от последовательности, но все еще пытается удалить последовательность вместе с таблицей (и, очевидно, не будет, потому что новая таблица зависит от нее).
Итак, вопрос состоит из двух частей:
- Почему последовательность все еще связана со старой таблицей?
- Есть ли способ обойти это, не заставляя новую таблицу зависеть от новой или другой последовательности (если это вообще поможет)?
(В PostgreSQL 8.4)