2012-02-28 13 views
1

現在、データベースはすべてのテーブルにプライマリキーを定義していません。 id列のすべてが単なる一意のインデックスです。私はそれらのインデックスを削除し、適切なプライマリキーでそれらを置き換えています。プライマリキーの変更の列の種類の追加

私の問題:私は、テーブルに主キーを追加するときはPostgresの8.4.7では、特定の1つのテーブルには、integerbigintからデータ型を変更します。私は、次のテーブル定義を持っている

psql=# \d events 
             Table "public.events" 
     Column   |   Type   |      Modifiers      
-----------------------+--------------------------+----------------------------------------------------- 
id     | bigint     | not null default nextval('events_id_seq'::regclass) 
[more columns omitted] 

Indexes: 
    "events_id_unique_pk" UNIQUE, btree (id) 
Foreign-key constraints: 
    "events_clearing_event_ref_fk" FOREIGN KEY (clearing_event_id) REFERENCES events(id) 
    "events_event_configs_id_fk" FOREIGN KEY (event_config_id) REFERENCES event_configs(id) 
    "events_pdu_circuitbreaker_id_fk" FOREIGN KEY (pdu_circuitbreaker_id) REFERENCES pdu_circuitbreaker(id) 
    "events_pdu_id_fk" FOREIGN KEY (pdu_id) REFERENCES pdus(id) ON DELETE CASCADE 
    "events_pdu_outlet_id_fk" FOREIGN KEY (pdu_outlet_id) REFERENCES pdu_outlet(id) 
    "events_sensor_id_fk" FOREIGN KEY (sensor_id) REFERENCES sensors(id) 
    "events_user_id_fk" FOREIGN KEY (clearing_user_id) REFERENCES users(id) 
Referenced by: 
    TABLE "events" CONSTRAINT "events_clearing_event_ref_fk" FOREIGN KEY (clearing_event_id) REFERENCES events(id) 
    TABLE "event_params" CONSTRAINT "events_params_event_id_fk" FOREIGN KEY (event_id) REFERENCES events(id) ON DELETE CASCADE 
Triggers: 
    event_validate BEFORE INSERT OR UPDATE ON events FOR EACH ROW EXECUTE PROCEDURE event_validate() 

は、これは何が起こるかです:

psql=# ALTER TABLE events ADD PRIMARY KEY (id); 
NOTICE: ALTER TABLE/ADD PRIMARY KEY will create implicit index "events_pkey" for table "events" 
ALTER TABLE 
psql=# \d events 
             Table "public.events" 
     Column   |   Type   |      Modifiers      
-----------------------+--------------------------+----------------------------------------------------- 
id     | integer     | not null default nextval('events_id_seq'::regclass) 
[more columns omitted] 

Indexes: 
    "events_pkey" PRIMARY KEY, btree (id) 
    "events_id_unique_pk" UNIQUE, btree (id) 
Foreign-key constraints: 
    "events_clearing_event_ref_fk" FOREIGN KEY (clearing_event_id) REFERENCES events(id) 
    "events_event_configs_id_fk" FOREIGN KEY (event_config_id) REFERENCES event_configs(id) 
    "events_pdu_circuitbreaker_id_fk" FOREIGN KEY (pdu_circuitbreaker_id) REFERENCES pdu_circuitbreaker(id) 
    "events_pdu_id_fk" FOREIGN KEY (pdu_id) REFERENCES pdus(id) ON DELETE CASCADE 
    "events_pdu_outlet_id_fk" FOREIGN KEY (pdu_outlet_id) REFERENCES pdu_outlet(id) 
    "events_sensor_id_fk" FOREIGN KEY (sensor_id) REFERENCES sensors(id) 
    "events_user_id_fk" FOREIGN KEY (clearing_user_id) REFERENCES users(id) 
Referenced by: 
    TABLE "events" CONSTRAINT "events_clearing_event_ref_fk" FOREIGN KEY (clearing_event_id) REFERENCES events(id) 
    TABLE "event_params" CONSTRAINT "events_params_event_id_fk" FOREIGN KEY (event_id) REFERENCES events(id) ON DELETE CASCADE 
Triggers: 
    event_validate BEFORE INSERT OR UPDATE ON events FOR EACH ROW EXECUTE PROCEDURE event_validate() 

私はいくつかの回避策を検討し、それが起こって、なぜ私は本当にかなり知っていると思います。他にもbigintを使用しているテーブルがいくつかありますので、ソリューションをハックする必要はありません。

これはLiquibaseでスクリプト化されていますが、Postgresのコンソールで直接発生します。


更新

他の二つのポイント:

  • 私は、bigint idとidに一意のインデックスと簡単なテーブルを作成し、主キー、および列タイプを追加することができます同じままです。
  • 実行時にすべてのテーブルが空です。

これは制約と関係がありますか?

+1

主キーの制約を追加すると列のタイプが変わる可能性があるとは思えませんが、しばらくはバグだとしましょう。最新のマイナーバージョンに更新し、もう一度テストしてください。 –

+0

@ MilenA.Radevこれはコンソールからのリテラル出力であり、これら3つのコマンドは順次入力されました。とにかくPostgres 8.4から9.1へのアップグレードが進行中です。私はそれを数日で試すことができます。 – Brandan

答えて

1

初めて遭遇したときに証人を何度も再生した後でも、翌日にこれを再現できませんでした。私はgremlinsにそれをチョークしています。

1

これはかなり面白いです。私はバージョン9.1.0でそれを再現することはできません(はい、私もアップグレードする必要があります!)。しかし、元のテーブルとシーケンスがどのように作成されたのか正確には分かりません。

このページでは、SERIALとINTEGER間のタイプの同様の自動変更をほのめかすようだ:http://grover.open2space.com/content/migrate-data-postgresql-and-maintain-existing-primary-key

は、それが代わりにBIGSERIALのSERIALを使用してテーブルを作成し、その後、BIGINTするタイプを強制的のようなものだろうか?シーケンスと主キー操作の間に何かがあると、リセットされている可能性があります。

関連する問題