18

私はテーブルを持っていますfoo。サイトの迅速なアップグレード/展開のために、次のtmp_fooようにして、新しいデータを含む新しいテーブル を作成しました。

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

各テーブルには、id次のような PK 列があります。

   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そのため、シーケンスへの目に見える依存関係はなくなりましたが、テーブルとともにシーケンスを削除しようとします (新しいテーブルがそれに依存しているため、明らかにそうしません) 。

したがって、質問は2部構成です。

  1. シーケンスがまだ古いテーブルにリンクされているのはなぜですか?
  2. 新しいテーブルを新しいシーケンスまたは別のシーケンスに依存させることを伴わない、これを回避する方法はありますか (それが役立つ場合)?

(PostgreSQL 8.4 の場合)

4

1 に答える 1

32

これを試して:

ALTER SEQUENCE foo_id_seq OWNED BY NONE

その後、テーブルを削除できるはずです。

シーケンスの「所有者」を取得するには、次のクエリを使用します

s.relname を sequence_name として選択し、  
       n.nspname を sequence_schema として、  
       t.relname を related_table として、
       a.attname を 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)
于 2010-12-01T20:56:23.147 に答える