2012-05-25 104 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

相关问题