MySQL 기초 - 명령어, DDL, 테이블 관리
MySQL 접속 및 기본 명령어
MySQL 접속
mysql -u root -p -h {server_ip} --port {port}
옵션 설명
-u: 사용자명-p: 비밀번호 입력 (프롬프트에서 입력)-h: 호스트 IP--port또는-P: 포트 번호
mysqldump
데이터베이스 백업을 위한 유틸리티입니다:
-h: host ip-P: port
DDL (Data Definition Language)
DDL은 데이터베이스 구조를 정의하는 언어입니다.
주요 명령어
| 명령어 | 설명 |
|---|---|
| CREATE | 데이터베이스/테이블/인덱스 등 생성 |
| DROP | 데이터베이스/테이블/인덱스 등 삭제 |
| ALTER | 기존 구조 변경 |
데이터베이스 관리
데이터베이스 생성
CREATE DATABASE mydb;
데이터베이스 선택
connect db_name;
-- 또는
USE db_name;
테이블 관리
테이블 목록 조회
SHOW TABLES;
테이블 생성
CREATE TABLE customers (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
address VARCHAR(255)
);
테이블 구조 변경
ALTER TABLE customers ADD COLUMN id INT AUTO_INCREMENT PRIMARY KEY;
테이블 삭제
DROP TABLE IF EXISTS customers;
테이블 정보 확인
테이블 생성 구문 확인
SHOW CREATE TABLE message_collect;
테이블 컬럼 및 인덱스 정보
EXPLAIN message_collect;
-- 또는
DESCRIBE message_collect;
인덱스 관리
인덱스 생성
CREATE INDEX index_name ON table_name (column_name);
또는 ALTER TABLE 사용:
ALTER TABLE message_collect_raw ADD KEY message_collect_raw_key_id (id);
Mac에서 MySQL 설정
my.cnf 파일 위치 찾기
mysql --help | grep cnf
group by 모드 설정
my.cnf 파일에 다음 내용을 추가합니다:
[mysqld]
sql-mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
이 설정은 ONLY_FULL_GROUP_BY 모드를 제외하여 GROUP BY 관련 제약을 완화합니다.
사용자 관리
사용자 생성
CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';
CREATE USER 'newuser'@'%' IDENTIFIED BY 'password'; -- 모든 호스트에서 접속 허용
권한 부여
-- 특정 데이터베이스의 모든 권한 부여
GRANT ALL PRIVILEGES ON mydb.* TO 'newuser'@'localhost';
-- 특정 권한만 부여
GRANT SELECT, INSERT, UPDATE ON mydb.* TO 'newuser'@'localhost';
-- 권한 적용
FLUSH PRIVILEGES;
사용자 조회
SELECT user, host FROM mysql.user;
사용자 삭제
DROP USER 'newuser'@'localhost';
데이터 타입 상세
숫자 타입
| 타입 | 바이트 | 범위 (signed) | 용도 |
|---|---|---|---|
| TINYINT | 1 | -128 ~ 127 | 상태값, 플래그 |
| SMALLINT | 2 | -32,768 ~ 32,767 | 작은 코드값 |
| MEDIUMINT | 3 | -8,388,608 ~ 8,388,607 | 중간 크기 |
| INT | 4 | 약 -21억 ~ 21억 | 일반 ID |
| BIGINT | 8 | 매우 큰 범위 | 큰 ID, 타임스탬프 |
문자열 타입
-- CHAR: 고정 길이 (최대 255)
name CHAR(10) -- 항상 10바이트 사용
-- VARCHAR: 가변 길이 (최대 65,535)
email VARCHAR(255) -- 실제 데이터 크기 + 1~2바이트
-- TEXT 계열
description TEXT -- 최대 65,535바이트
content MEDIUMTEXT -- 최대 16MB
full_content LONGTEXT -- 최대 4GB
날짜/시간 타입
| 타입 | 형식 | 범위 |
|---|---|---|
| DATE | YYYY-MM-DD | 1000-01-01 ~ 9999-12-31 |
| TIME | HH:MM:SS | -838:59:59 ~ 838:59:59 |
| DATETIME | YYYY-MM-DD HH:MM:SS | 1000-01-01 ~ 9999-12-31 |
| TIMESTAMP | YYYY-MM-DD HH:MM:SS | 1970-01-01 ~ 2038-01-19 |
TIMESTAMP는 시간대(timezone) 변환을 자동으로 처리하므로 글로벌 서비스에서 유용합니다. DATETIME은 입력한 값 그대로 저장됩니다.
ALTER TABLE 상세
테이블 구조 변경 시 자주 사용하는 ALTER TABLE 명령어들입니다.
컬럼 추가
ALTER TABLE customers ADD COLUMN email VARCHAR(255) NOT NULL DEFAULT '';
ALTER TABLE customers ADD COLUMN phone VARCHAR(20) AFTER name; -- name 컬럼 뒤에 추가
컬럼 수정
-- 컬럼 타입 변경
ALTER TABLE customers MODIFY COLUMN name VARCHAR(500);
-- 컬럼명과 타입 동시 변경
ALTER TABLE customers CHANGE COLUMN name full_name VARCHAR(500);
컬럼 삭제
ALTER TABLE customers DROP COLUMN phone;
테이블명 변경
RENAME TABLE old_name TO new_name;
외래 키 (Foreign Key)
외래 키 생성
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
customer_id INT,
order_date DATE,
FOREIGN KEY (customer_id) REFERENCES customers(id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
ON DELETE / ON UPDATE 옵션
| 옵션 | 설명 |
|---|---|
| CASCADE | 부모 삭제/수정 시 자식도 함께 처리 |
| SET NULL | 부모 삭제/수정 시 자식의 FK를 NULL로 설정 |
| RESTRICT | 자식이 있으면 부모 삭제/수정 불가 (기본값) |
| NO ACTION | RESTRICT와 동일 |
외래 키 확인
-- 테이블의 외래 키 확인
SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = 'orders' AND CONSTRAINT_SCHEMA = 'mydb';
실무에서는 외래 키 제약조건이 성능에 영향을 줄 수 있으므로, 대용량 트래픽 서비스에서는 애플리케이션 레벨에서 참조 무결성을 관리하고 DB에는 외래 키를 설정하지 않는 경우도 많습니다.
Comments