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

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

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

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

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



답변

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 참조하십시오 .


답변

열 위치 변경 :

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;


답변

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

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

내 phpMyAdmin 버전은 4.1.7입니다


답변

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);


답변