1

私たちのデータベースは現在、どのテーブルにも主キーを定義していません。すべてのid列は単純な一意のインデックスです。これらのインデックスを削除し、適切な主キーに置き換えています。

私の問題: Postgres 8.4.7 では、テーブルに主キーを追加すると、特に 1 つのテーブルのデータ型が からbigintに変更されます。integer

次のテーブル定義があります。

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 コンソールでも直接実行されます。


アップデート

その他の 2 つのポイント:

  • bigintでID と一意のインデックスを持つ単純なテーブルを作成しid、主キーを追加すると、列の型は同じままです。
  • 実行時にはすべてのテーブルが空です。

制約と何か関係があるのでしょうか?

4

2 に答える 2

1

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

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

BIGSERIAL の代わりに SERIAL を使用してテーブルを作成し、型を BIGINT に強制するようなものでしょうか? シーケンスと主キーの操作の間に何かがリセットされた可能性があります。

于 2012-04-16T04:06:54.083 に答える
1

最初に目撃者と何度も再現した後も、翌日には再現できませんでした。私はグレムリンまでそれをチョークしています。

于 2012-06-20T16:14:31.533 に答える