2012-05-25 7 views
1

Я сейчас застрял в уловке 22 с помощью приложения Django. Мне нужно изменить тип столбца с переменной Varying на Integer, поскольку я перехожу от UUID к обычным старым идентификаторам (данные не меняются, как только это физические константы). Теперь Джанго бросил Fit первоначально о не будучи в состоянии отлиты из 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 пытается синхронизироваться, но не работает. также,

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

Нет сценария, он генерируется Django на лету, когда я запускаю syncdb. – 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 ограничение на падение glass_fill_manufacturer_glass_fill_idkey ; ALTER TABLE glass_fill ALTER COLUMN id TYPE INTEGER ИСПОЛЬЗОВАНИЕ CAST (id AS INT); альтер стол glass_fill_manufacturer ADD table_constraint glass_fill_manufacturer_glass_fill_id_fkey внешнего ключ (glass_fill_id) ссылка glass_fill (идентификатор) , 'но я получаю ошибку синтаксиса? 'ОШИБКА: синтаксическая ошибка в или рядом с« foreign » LINE 9: внешний ключ (glass_fill_id) ссылки glass_fill (id)' – Jharwood

+0

@Jharwood Я думаю, что я исправил синтаксис и отредактировал ответ.Просто попробуйте только первую команду. –

1

Вы должны сделать следующее:

  1. Капля ограничения
  2. Создайте временную таблицу для хранения соответствия между старыми и новыми идентификаторами
  3. Update glass_fill , возвращая значения во временную таблицу
  4. Обновление ссылающаяся таблица из временной таблицы
  5. Alter типов столбцов на все столах
  6. Воссоздать ограничения
+0

Вы могли бы указать мне на любой справочный материал для вышеуказанных действий? Я относительно новичок, когда речь заходит о PostgreSQL, и я не думаю, что еще слышал о ограничениях? – Jharwood

+0

@ Jharwood: http://www.postgresql.org/docs/9.1/static/sql-altertable.html. Ограничения в вашем случае - «FOREIGN KEY» (поиск определений 'REFERENCES' в ваших таблицах). Вы работаете с чужим кодом? – Quassnoi

+0

да я, я взял его на хранение и в процессе обновления всего – Jharwood

Смежные вопросы