2012-01-23 2 views
2

У меня есть таблица с столбцом типа INT (7), и я хочу сделать это ограничение внешнего ключа для первичного ключа другой таблицы. Однако основным ключом является тип INT (11) UNSIGNED, поэтому мне нужно изменить INT (7), чтобы он соответствовал тому, чтобы внешний ключ был создан.Тест перед изменением типа столбца MySQL

Хотя я не ожидаю каких-либо проблем с преобразованием INT (7) в INT (11) UNSIGNED (я проверил столбца, который нужно изменить, и он не имеет значений без знака), есть ли способ спросить MySQL в каких строках это изменит значение? Я все равно возьму резервную копию, но я хотел бы узнать, есть ли какие-либо проблемы заранее, поскольку я могу их исправить, прежде чем запускать инструкцию ALTER TABLE.

+1

Может быть сделать Создание Новая_таблицы, как oldTable и сделать изменения на Новая_таблица затем выполнить сравнение, чтобы увидеть, где строки не совпадают? Это первое, что мне кажется, но некоторые из гуру MySql могут знать о лучшем способе. – Brian

+0

Резервное копирование, резервное копирование, резервное копирование – Mchl

+0

Я действительно сказал, что возьму резервную копию, однако я хотел бы знать заранее, будут ли внесены какие-либо изменения. Если есть строки, которые могут вызвать проблемы, я могу их дважды проверить/исправить, прежде чем менять таблицу. – pwaring

ответ

2

пробег

CREATE TABLE tmp SELECT yourcolumnname AS x, yourcolumnname AS y FROM yourtable; 
ALTER TABLE tmp MODIFY COLUMN x INT(11) UNSIGNED; 
SELECT * FROM tmp WHERE x!=y; 
DROP TABLE tmp; 
+0

Очень приятное решение, отметит это и для других табличных модификаций. – pwaring

0

Да, ALTER TABLE не фиксируется, если используется ключевое слово ВРЕМЕННОЕ.

ALTER TEMPORARY TABLE .... [your code] 

Source

EDIT: Я просто не заметил:.

«Однако, хотя никаких неявных не совершат происходит, и не может заявление откатить Поэтому использование таких заявлений будет Нарушить транзакционную атомарность: например, если вы используете CREATE ВРЕМЕННЫЙ ТАБЛИЦ, а затем откатите транзакцию, таблица останется ".

Так что я не уверен насчет ALTER.

+1

Это не сработает: ALTER TABLE неявно выполняет COMMIT –

+0

Вы правы. Исправлена. – Jivings

+0

Это не работает, я просто попробовал его на сервере разработки, и ALTER TABLE сразу исправляется - ROLLBACK не имеет никакого эффекта (я запускаю запас MySQL с Debian, не уверен, что он отключил транзакции/авто -commit enabled). – pwaring

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