2012-01-23 2 views
2

INT (7) 유형의 열이있는 테이블이 있고이 테이블을 다른 테이블의 기본 키에 대한 외래 키 제약 조건으로 만들고 싶습니다. 그러나 기본 키 형식 INT (11) UNSIGNED, 그래서 외래 키를 만들려면 일치하도록 INT (7) 변경해야합니다.MySQL 열 유형을 변경하기 전에 테스트

INT (7)을 INT (11) UNSIGNED (변경해야 할 열을 검사했고 부호없는 값이 있음)로 변환하는 데 문제가 없겠지만 MySQL에 요청하는 방법이 있습니까? 어느 행이 값을 바꿀까요? 어쨌든 백업을 할 것이지만 ALTER TABLE 문을 실행하기 전에 잠재적으로 문제를 해결할 수 있기 때문에 사전에 문제가있을 수 있는지 확인하고 싶습니다.

+1

은 어쩌면이 oldTable로 newTable를 작성하고 newTable의 변화는 다음이 행이 일치하지 않는 곳을보고 비교합니까해야합니까? 이것이 내 머리 꼭대기에서 가장 먼저하는 일이지만, 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은 TEMPORARY 키워드가 사용되면 커밋하지 않습니다.

ALTER TEMPORARY TABLE .... [your code] 

Source

편집 : 난 그냥이 발견되지 :. 암시 적 커밋 없지만, 그러나

"을 발생, 어느 쪽도 문이 롤백 할 수 있습니다 따라서, 이러한 진술의 사용은 것입니다 트랜잭션 원 자성 위반 : 예를 들어 CREATE TEMPORARY TABLE을 사용한 다음 트랜잭션을 롤백하면 테이블에 이 남아 있습니다.

따라서 ALTER에 대해 확실하지 않습니다.

+1

이것은 작동하지 않습니다. ALTER TABLE은 암시 적으로 COMMIT을합니다 –

+0

당신 말이 맞습니다. 결정된. – Jivings

+0

그게 작동하지 않는 것처럼 보였습니다. 개발 서버에서 시도했는데 ALTER TABLE이 즉시 커밋되었습니다. ROLLBACK은 효과가 없습니다 (데비안에서 제공하는 MySQL을 실행하고 있습니다. -commit enabled). – pwaring