LINUX.ORG.RU

mysql, foreign key, поменять формат поля. Как?


0

0

Собственно, задача, например, сделать ALTER TABLE и сменить поле INT(11) на TINYINT(5) UNSIGNED.

Проблема - на это поле туева хуча внешних ссылок.

MySQL поменять формат в этом случае не позволяет.

То есть, напрашивается скриптик, который соберёт инфу об индексах и связях, грохнет все связанные с данным полем внешние ключи, сделает необходимый ALTER TABLE и создаст все ключи и индексы снова.

Есть где-нибудь такое, достаточно нужное решение?

★★★★★

> Есть где-нибудь такое, достаточно нужное решение?

насколько я помню, официльно MySQL предполагает именно так: вручную убираешь связи, меняешь поле, создаёшь связи. Суть в том, что обычно этих связей не так много.

name_no ★★
()

может добавить колонку tinyint, скопировать туда значения из int, пресоздать внешние ключи, грохнуть int.

dimon555 ★★★★★
()
Ответ на: комментарий от dimon555

может добавить колонку tinyint, скопировать туда значения из int, пресоздать внешние ключи, грохнуть int.

Неа. Ибо:

http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html

Corresponding columns in the foreign key and the referenced key must have similar internal data types inside InnoDB so that they can be compared without a type conversion. The size and sign of integer types must be the same. The length of string types need not be the same. For nonbinary (character) string columns, the character set and collation must be the same.

Т.е., очевидно, что внешние ключи уже имеют оригинальный тип. И AFAIU попытка перенатравить их на новый тип к успеху не приведет. Т.е. нужно не только менять колонку в родительской таблице, но и во всех дочерних..

bibi
()

SET foreign_key_checks = 0;

изменить тип колонки и всех связанных с ней колонок

SET foreign_key_checks = 1;

а действие то не сильно нужное =)

qnikst ★★★★★
()
Ответ на: комментарий от qnikst

>SET foreign_key_checks = 0;

Ну, я это, как бы, в первую очередь пробовал :) Не работает оно. error 150 выдаёт после.

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от name_no

>насколько я помню, официльно MySQL предполагает именно так: вручную убираешь связи, меняешь поле, создаёшь связи. Суть в том, что обычно этих связей не так много.

Это ужасный геморрой. Даже для полудюжины связей. А процесс, между тем, прекрасно автоматизируется. Вот и завёл тему, вдруг кто-то видел, как кто-нибудь эту задачу уже решал.

...

Но, походу, придётся самому скриптовать снова.

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от bibi

>Т.е. нужно не только менять колонку в родительской таблице, но и во всех дочерних..

Именно так. Формат всех связанных столбцов должен совпадать.

KRoN73 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.