2012-05-25 67 views
1

我目前被困在一個catch與我的Django應用程序22。當我從UUID移動到普通的舊ID時(由於它是物理常數,數據不會改變),我必須將列的類型從Varying char更改爲Integer。現在Django的一陣痙攣原本約不能夠從varchar轉換爲INT,所以我「幫助」它具有:如何更改PostgreSQL中的列類型和所有外鍵?

ALTER TABLE glass_fill ALTER COLUMN id TYPE INTEGER USING CAST(id AS INT); 

現在,它說:

django.db.utils.DatabaseError: foreign key constraint "glass_fill_manufacturer_glass_fill_id_fkey" cannot be implemented 
DETAIL: Key columns "glass_fill_id" and "id" are of incompatible types: integer and character varying. 

什麼想法?

注意:glass_fill_manufacturer表尚未創建,但Django嘗試在syncdb上執行,但失敗。還有,

ALTER TABLE glass_fill ALTER COLUMN id TYPE INTEGER USING CAST(id AS INT); 

線沒有改變列,因爲我認爲。

glass_fill表模式:

-- Table: glass_fill 

-- DROP TABLE glass_fill; 

CREATE TABLE glass_fill 
(
    id character varying(36) NOT NULL, 
    name character varying(255), 
    temperature real, 
    density real, 
    viscosity real, 
    conductivity real, 
    heat_capacity real, 
    colour text, 
    CONSTRAINT glass_fill_pkey PRIMARY KEY (id) 
) 
WITH (
    OIDS=FALSE 
); 
+0

請發佈'glass_fill_manufacturer'腳本。 – Quassnoi

+0

沒有腳本,當我運行syncdb時,它由Django實時生成。 – Jharwood

回答

5
ALTER TABLE glass_fill_manufacturer 
ALTER COLUMN glass_fill_id TYPE INTEGER USING CAST(glass_fill_id AS INT) 
; 

我猜你的文字Django會以某種方式做,但如果它不:

ALTER TABLE glass_fill_manufacturer 
drop constraint glass_fill_manufacturer_glass_fill_id_fkey 
; 

alter table glass_fill_manufacturer 
ADD constraint glass_fill_manufacturer_glass_fill_id_fkey 
foreign key (glass_fill_id) references glass_fill (id) 
; 
+0

我認爲我在這兩條語句之間改變了我的glass_fill表? – Jharwood

+0

我試過這個:'ALTER TABLE glass_fill_manufacturer drop constraint glass_fill_manufacturer_glass_fill_id_fkey ; ALTER TABLE glass_fill ALTER COLUMN ID TYPE INTEGER USING CAST(id AS INT); ALTER TABLE glass_fill_manufacturer ADD table_constraint glass_fill_manufacturer_glass_fill_id_fkey 外鍵(glass_fill_id)引用glass_fill(ID) ;'但我得到一個語法錯誤? 'ERROR:語法錯誤處於或接近「foreign」 LINE 9:外鍵(glass_fill_id)引用glass_fill(id)' – Jharwood

+0

@Jharwood我想我修復了語法並編輯了答案。只需嘗試第一個命令。 –

1

你應該做到以下幾點:

  1. 刪除約束
  2. 創建臨時表來保存新老ID之間的映射
  3. 更新glass_fill ,將值返回到臨時表
  4. 更新從臨時表
  5. 阿爾特列類型上的所有表
  6. 在引用表重新創建約束
+0

你能指出我對上述行爲的任何參考材料嗎?當談到PostgreSQL時,我相對比較新手,我不認爲我甚至聽說過約束? – Jharwood

+0

@Jharwood:http://www.postgresql.org/docs/9.1/static/sql-altertable.html。你的情況下的約束是'FOREIGN KEY'(在你的表的定義中搜索'REFERENCES')。你在使用別人的代碼嗎? – Quassnoi

+0

是的我是,我接管了它並且正在更新所有內容 – Jharwood

相關問題