MariaDB / TABLE / 열 추가하기, 열 삭제하기, 열 순서 변경하기, 열 데이터 타입 변경하기
MariaDB 테이블의 열은 ALTER TABLE의 ADD COLUMN으로 추가하고 DROP COLUMN으로 삭제합니다. 기존 열의 자료형·위치는 MODIFY COLUMN, 이름까지 함께 바꾸려면 CHANGE COLUMN을 사용할 수 있습니다. MODIFY·CHANGE에는 새 열 정의를 적으므로 순서만 옮길 때도 기존 속성을 빠뜨리지 않아야 합니다.
변경 전 구조와 데이터 보관
MariaDB 서버·SQL 클라이언트와 learning 실습 DB가 필요합니다. 별도 실습 환경에서 다음을 한 번 실행한 뒤 뒤의 블록을 위에서부터 순서대로 실행하세요. 테이블 생성·입력·조회·ALTER 권한이 필요합니다. 같은 이름의 테이블이 이미 있으면 기존 자료를 삭제해 덮어쓰지 말고 새 실습 DB를 사용합니다.
USE learning;
CREATE TABLE products_columns_demo (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(30) NOT NULL COMMENT '상품명',
quantity INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '재고',
note VARCHAR(20) NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO products_columns_demo VALUES
(1, '노트', 5, '기존 메모'), (2, '컵', 3, NULL);
SHOW CREATE TABLE products_columns_demo;
처음 열 순서는 id·name·quantity·note입니다. quantity에는 UNSIGNED, NOT NULL, DEFAULT 0과 주석이 있으며, note에는 나중에 삭제 영향을 확인할 기존 메모가 있습니다. SHOW CREATE TABLE의 결과와 필요한 행 데이터를 변경 전에 보관하세요. 구조 조회 결과만으로는 행 데이터가 백업되지 않습니다.
운영에서는 백업·복원 가능성을 확인하고 앱의 조회·입력 코드, 인덱스·외래 키·뷰 등의 의존성을 검토합니다. 열 정의 옵션의 의미는 CREATE TABLE 문서를 참고하세요. 구조와 실제 값을 함께 비교해야 변경 후 누락을 발견할 수 있습니다.
열 추가: 마지막·FIRST·AFTER와 여러 열
ALTER TABLE products_columns_demo
ADD COLUMN created_at DATETIME NULL;
SHOW FULL COLUMNS FROM products_columns_demo;
created_at은 위치를 지정하지 않아 마지막 열이 됩니다. 기존 두 행의 값은 이 예제에서 NULL입니다. NOT NULL 열을 실제 자료가 있는 테이블에 추가할 때는 기존 행에 어떤 값을 채울지 먼저 설계해야 하며, 모든 자료형에 같은 기본값이 생긴다고 가정하지 마세요.
ALTER TABLE products_columns_demo
ADD COLUMN category VARCHAR(20) NULL FIRST,
ADD COLUMN unit_price DECIMAL(10,2) NOT NULL DEFAULT 0.00 AFTER name;
SHOW FULL COLUMNS FROM products_columns_demo;
category는 FIRST로 맨 앞에, unit_price는 AFTER name으로 이름 뒤에 들어갑니다. 여러 변경 절은 쉼표로 구분합니다. 결과 순서는 category·id·name·unit_price·quantity·note·created_at입니다. 기존 행의 unit_price는 지정한 기본값 0.00이 됩니다. 이는 실습용 초기값이며 실제 가격이 0이라는 업무 판단을 대신하지 않습니다.
SHOW FULL COLUMNS는 열 이름·자료형·NULL 허용·기본값뿐 아니라 콜레이션과 주석도 보여 줍니다. 출력 필드의 의미는 SHOW COLUMNS 문서에서 확인할 수 있습니다. 필요한 속성이 있는 열을 뒤에서 옮길 때 이 정의를 기준으로 합니다.
열 삭제: 해당 열의 데이터도 제거
다음은 실습용 note 열을 삭제합니다. 기존 메모도 함께 사라지므로 보존할 데이터가 있는 실제 테이블에서는 백업과 사용처 확인을 먼저 해야 합니다.
ALTER TABLE products_columns_demo DROP COLUMN note;
SHOW FULL COLUMNS FROM products_columns_demo;
목록에서 note가 없어지고, 남은 열은 category·id·name·unit_price·quantity·created_at입니다. 행 자체를 삭제하는 DELETE나 테이블 전체를 삭제하는 DROP TABLE과 구분하세요. 같은 이름의 note 열을 나중에 다시 추가해도 예전 메모가 자동으로 복원되지는 않습니다.
열이 인덱스·제약 조건이나 다른 객체에 연결되어 있으면 단순한 실습과 영향이 다를 수 있습니다. 오류를 피하려고 의존성을 무조건 해제하지 말고 참조 관계부터 확인해야 합니다. 전체 구문과 제약은 ALTER TABLE 문서를 참고하세요.
기존 열 순서 이동과 속성 보존
quantity를 맨 앞으로 옮깁니다. 열 이름과 자료형만 적지 않고 원래의 UNSIGNED·NOT NULL·DEFAULT·COMMENT도 함께 적었습니다.
ALTER TABLE products_columns_demo
MODIFY COLUMN quantity INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '재고' FIRST;
SHOW FULL COLUMNS FROM products_columns_demo;
순서는 quantity·category·id·name·unit_price·created_at이 됩니다. 값 5와 3은 그대로 남아야 하며 기본값과 주석도 비교하세요. 이번에는 같은 열을 unit_price 뒤로 다시 옮깁니다.
ALTER TABLE products_columns_demo
MODIFY COLUMN quantity INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '재고' AFTER unit_price;
SHOW FULL COLUMNS FROM products_columns_demo;
순서는 category·id·name·unit_price·quantity·created_at으로 돌아옵니다. 원하는 화면 출력 순서만 바꾸려는 것이라면 SELECT의 열 나열 순서를 바꾸는 것으로 충분할 수 있습니다. 테이블 구조 변경과 조회 화면의 순서 변경을 구분하면 불필요한 ALTER를 줄일 수 있습니다.
특히 SELECT * 결과나 열 목록 없는 INSERT의 순서에 의존하는 코드는 구조 변경에 취약합니다. 앱에서는 필요한 열을 명시하고, 기존 테이블의 정의를 그대로 확인한 뒤 순서 변경을 계획하세요. 열 위치를 바꾼다고 조회 성능이 자동으로 개선되는 것도 아닙니다.
자료형 변경과 열 이름 변경
name의 최대 길이를 30문자에서 100문자로 늘립니다. 이름은 그대로 유지하므로 MODIFY를 사용하고 원래의 NOT NULL과 주석을 보존합니다.
ALTER TABLE products_columns_demo
MODIFY COLUMN name VARCHAR(100) NOT NULL COMMENT '상품명';
SHOW FULL COLUMNS FROM products_columns_demo;
VARCHAR의 길이는 문자 수이며 실제 바이트 제한·문자셋 조건은 별도로 고려해야 합니다. 길이를 줄이거나 문자열을 숫자로 바꿀 때는 기존 값이 새 범위에 들어가는지 사전에 검사해야 합니다. VARCHAR 문서와 SQL 모드 문서에서 잘림·오류 처리 조건을 확인하세요. 경고가 나왔는데도 결과를 확인하지 않고 진행하면 데이터 손실을 놓칠 수 있습니다.
quantity의 이름을 stock으로 바꾸면서 범위를 BIGINT로 넓히는 예제는 다음과 같습니다. CHANGE에서는 이전 이름과 새 이름을 차례대로 쓰고 새 정의를 적습니다.
ALTER TABLE products_columns_demo
CHANGE COLUMN quantity stock BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '재고';
SHOW FULL COLUMNS FROM products_columns_demo;
열 순서는 유지되고 이름이 stock으로 바뀝니다. NOT NULL·기본값 0·UNSIGNED와 재고 주석을 보존했는지 확인하세요. 예전 quantity 이름을 사용하는 앱의 쿼리는 함께 수정해야 합니다. 이름만 바꾸는 전용 구문은 지원 버전을 확인해 선택할 수 있지만, 여기서는 이름과 정의를 함께 지정하는 CHANGE를 실습했습니다.
최종 확인과 변경을 되돌리는 조건
SELECT id, name, stock, unit_price, category, created_at
FROM products_columns_demo ORDER BY id;
SHOW CREATE TABLE products_columns_demo;
두 행의 id·name·stock은 각각 1·노트·5, 2·컵·3이어야 합니다. unit_price는 모두 0.00, category와 created_at은 NULL입니다. SHOW CREATE TABLE에서 name이 VARCHAR(100), stock이 BIGINT UNSIGNED인지와 기본값·주석을 확인합니다. 열의 순서만 맞는 것으로 검토를 끝내지 마세요.
열 이름과 순서를 다시 ALTER로 되돌리는 것은 가능하지만, 자료형을 좁히려면 새로 들어온 값까지 원래 범위에 맞는지 다시 확인해야 합니다. 삭제한 열의 데이터나 변환 과정에서 손실된 값은 역방향 ALTER만으로 복원되지 않습니다. 미리 보관한 데이터와 복원 계획이 필요합니다.
ALTER TABLE은 일반적으로 암시적 커밋을 일으키므로 ROLLBACK만으로 구조 변경을 취소할 수 있다고 생각하면 안 됩니다. 암시적 커밋 목록을 참고하세요. 큰 테이블에서는 재구성·잠금 대기가 발생할 수 있고 알고리즘 지원도 버전·엔진·작업에 따라 다르므로, 운영 적용 전에는 복제한 데이터로 시간과 동시 사용 영향을 확인해야 합니다.




