如何在PostgreSQL中更改列类型和所有外键?

时间:2012-05-25 11:13:26

标签: django postgresql

我目前在我的Django应用程序中陷入困境22。我必须将列的类型从Varying char更改为Integer,因为我正在从UUID转移到普通的旧ID(数据不会像物理常量那样改变)。现在django最初扔了一个Fit,因为无法从VarChar投射到Int,所以我“帮助”了它:

 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
);

2 个答案:

答案 0 :(得分:6)

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)
;

答案 1 :(得分:1)

您应该执行以下操作:

  1. 删除约束
  2. 创建一个临时表以保存旧ID和新ID之间的映射
  3. 更新glass_fill,将值返回临时表
  4. 从临时表中更新引用表
  5. 更改所有表格上的列类型
  6. 重新创建约束
相关问题