2012-02-28 84 views
1

我們的數據庫當前沒有在任何表上定義主鍵。所有id列都只是唯一索引。我刪除這些索引並用正確的主鍵替換它們。添加主鍵更改列類型

我的問題:在Postgres的8.4.7,特別是一個表改變從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控制檯中。


更新

其他兩個點:

  • 我可以創建一個簡單的表與bigint ID和id唯一索引,添加主鍵,列類型保持不變。
  • 執行時所有表都是空的。

它可能與約束有關嗎?

+1

我發現很難相信添加主鍵約束可能會改變列的類型,但是讓我們暫時假設它是一個錯誤。更新到最新的次要版本並再次測試。 – 2012-02-29 00:23:25

+0

@ MilenA.Radev這是控制檯的文字輸出,並且這三個命令是按順序輸入的。無論如何,我們正在從Postgres 8.4升級到9.1。我可以在幾天內對此進行測試。 – Brandan 2012-02-29 03:21:22

回答

1

即使在第一次發生與證人重複多次之後,我仍無法在第二天再次複製此內容。我正在把它寫成gremlins。

1

這很有趣。我不能在9.1.0版中複製它(是的,我應該升級!)。但是我不清楚原始表格和序列是如何創建的。

本頁面似乎暗示SERIAL和INTEGER之間的類型相似的自動變化:http://grover.open2space.com/content/migrate-data-postgresql-and-maintain-existing-primary-key

難道是像創建一個使用串行而不是BIGSERIAL表,然後強迫爲bigint類型?序列和主鍵操作之間的某些內容可能會重置它。