MySQL 테이블에서 열을 이동하는 방법?


207

현재 다음 MySQL 테이블이 있습니다. Employees (empID, empName, department);

테이블을 다음과 같이 변경하고 싶습니다. Employees (empID, department, empName);

ALTER진술을 사용하여 어떻게 이것을 할 수 있습니까?

참고 : 열 위치 만 변경하고 싶습니다.


왜 그런지 물어봐도 될까요? 열 순서는 거의 미학적 문제
일뿐입니다

6
@deceze는 아마도- SELECT *문 에서 값의 순서를 정의합니다 . (값의 순서가 중요한 경우, 명세서에 명시 적으로 값을 나열해야하지만 OP는 여기에 완전한 제어권이 없을 수도 있습니다.)
Ted Hopp

1
나는 그것이 아무런 영향을 미치지 않는다는 것을 알고 있습니다. 내 원래 테이블에 많은 열이 있으므로 마지막에 추가 된 3 개의 열을 추가했습니다. 그러나 나는 SELECT문장 의 사용을 용이하게하기 위해 3-4-5 위치에 표시하기를 원합니다
sumit

6
@iSumitG : 또한와 AFTER column함께 사용할 수 있습니다 ALTER TABLE ADD column. (다음 번에 일부 필드를 추가하십시오.)
ypercubeᵀᴹ

2
mysql 덤프를로드하는 경우 insert into values를 사용합니다. 예를 들어 prod에서 dev로 데이터를로드하고 열이 잘못되면 오류가 발생합니다. 그래서이 일을하고 싶을 수도 있습니다.
Hooray Im Helping

답변:


345

empName이 VARCHAR (50) 열인 경우 :

ALTER TABLE Employees MODIFY COLUMN empName VARCHAR(50) AFTER department;

편집하다

의견에 따라 다음을 수행 할 수도 있습니다.

ALTER TABLE Employees CHANGE COLUMN empName empName VARCHAR(50) AFTER department;

반복 empName은 의도적입니다. 동일한 열 이름을 유지하고 싶다고 MySQL에 알려야합니다.

두 구문 버전 모두 MySQL에만 해당된다는 점에 유의해야합니다. 예를 들어 PostgreSQL 또는 다른 많은 DBMS에서는 작동하지 않습니다.

다른 편집 : 주석에서 @Luis Rossi가 지적한 것처럼 AFTER수정 자 직전에 변경된 열 정의를 완전히 지정해야합니다 . 위의 예제에는가 VARCHAR(50)있지만 다른 특성 (예 : NOT NULL기본값)이 필요한 경우 해당 특성도 포함해야합니다. 자세한 내용 은 문서를ALTER TABLE 참조하십시오 .


6
참고 : MODIFY는 버전 4까지 지원되지 않습니다.
Erre Efe

4
구문에 따라 열 이름을 변경하고 싶을 수 있으므로 열 이름을 반복해야합니다. 예 : ALTER TABLE 직원 변경 열 empName empName varchar (50) AFTER 부서;
brianjcohen

변경된 순서는 데이터베이스 SQL 덤프에 반영되지 않습니다.
skalee

3
@SalehEnamShohag-예, docs 에 따르면 COLUMN키워드는 ALTER TABLE명령문 에서 선택 사항입니다 . 나는 문장을 더 읽기 쉽게 만든다고 생각하기 때문에 그것을 사용하는 것을 선호합니다.
Ted Hopp

1
나를 위해 잘 작동, 내 경우에 나는 열을 정의해야했다 NOT NULL DEFAULT 1, 이것은 예제에서 열 유형 직후에 수행됩니다VARCHAR(50)
Luiz Rossi

67

열 위치 변경 :

ALTER TABLE Employees 
   CHANGE empName empName VARCHAR(50) NOT NULL AFTER department;

첫 번째 위치로 이동해야하는 경우 ALTER TABLE CHANGE [COLUMN] 쿼리 끝에 FIRST라는 용어를 사용해야합니다.

ALTER TABLE UserOrder 
   CHANGE order_id order_id INT(11) NOT NULL FIRST;

24
첫 번째 위치로 이동하는 방법을 언급하는 것은 매우 유용했습니다
Tristian

2
이것이 큰 테이블에서 어떻게 수행되는지 알 수 있습니까? 메타 데이터 만 변경 했습니까? 아니면 실제로 디스크의 데이터를 재구성해야합니까?
Kip

6
nevermind, 3.9M 행이있는 테이블에서 시도하여 내 자신의 질문에 대답했습니다. 약 2 분이 걸렸습니다. 따라서 일부 메타 데이터를 바꾸는 것 이상을 확실히하고 있습니다.
Kip

14

phpMyAdmin은 테이블의 구조보기 내에서이를위한 GUI를 제공합니다. 이동할 열을 선택하고 열 목록 맨 아래에서 변경 조치를 클릭하십시오. 그런 다음 모든 열 속성을 변경할 수 있으며 화면 맨 오른쪽에 '열 이동'기능이 있습니다.

물론 이것은 완벽하게 최상의 답변으로 쿼리를 작성하는 것이지만 GUI 팬은 대안을 높이 평가할 수 있습니다.

내 phpMyAdmin 버전은 4.1.7입니다


1
이 질문은 구체적으로 "ALTER 문을 사용하여이 작업을 수행 할 수있는 방법"을 묻습니다. MySQL을 실행하는 모든 사람이 phpMyAdmin을 사용하는 것은 아닙니다.
Caleb

3
phpMyAdmin과 같은 GUI 도구의 쿼리 출력을 관찰하여 현재 명령 줄에서 수행하는 많은 작업을 배웁니다. 이 게시물이 ppl이이 기준에 맞는만큼 많은 다운 보트를 얻는 것에 대해 기쁘게 생각합니다.

이 작업을 위해 phpmyadmi는 작업을 수행하는 명령을 표시하지 않습니다. 찾을 수 없음
Tebe

2
와우, 트릭을 수행하고 OP가 ALTER SQL에 요청한 답변을 보완하는 대체 솔루션에 대한 분노가 너무 많습니다.
Ewen

1

10+ 테이블에서 제품의 후기 단계에서 소개 된 컬럼에 대해이를 실행해야했습니다. 따라서이 빠른 어수선한 스크립트를 작성하여 모든 '관련'테이블에 대한 alter 명령을 생성했습니다.

SET @NeighboringColumn = '<YOUR COLUMN SHOULD COME AFTER THIS COLUMN>';

SELECT CONCAT("ALTER TABLE `",t.TABLE_NAME,"` CHANGE COLUMN `",COLUMN_NAME,"` 
`",COLUMN_NAME,"` ", c.DATA_TYPE, CASE WHEN c.CHARACTER_MAXIMUM_LENGTH IS NOT 
NULL THEN CONCAT("(", c.CHARACTER_MAXIMUM_LENGTH, ")") ELSE "" END ,"  AFTER 
`",@NeighboringColumn,"`;")
FROM information_schema.COLUMNS c, information_schema.TABLES t
WHERE c.TABLE_SCHEMA = '<YOUR SCHEMA NAME>'
AND c.COLUMN_NAME = '<COLUMN TO MOVE>'
AND c.TABLE_SCHEMA = t.TABLE_SCHEMA
AND c.TABLE_NAME = t.TABLE_NAME
AND t.TABLE_TYPE = 'BASE TABLE'
AND @NeighboringColumn IN (SELECT COLUMN_NAME 
    FROM information_schema.COLUMNS c2 
    WHERE c2.TABLE_NAME = t.TABLE_NAME);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.