반응형
MySQL 실습 정리
PREPARE 바인딩
물음표 자리표시자에 USING 값으로 INSERT하는 패턴
1 핵심 개념
물음표 자리표시자에 USING 값으로 INSERT하는 패턴. 이 예제는 문법 한 줄보다 실행 순서와 객체 관계를 이해하는 것이 중요하다.
테이블 생성과 제약조건은 데이터 무결성을 정하는 작업이고, PREPARE는 SQL을 문자열로 준비해 실행하는 작업이다. 둘 다 순서를 잘못 잡으면 문법은 맞아도 실행 오류가 난다.
외래키는 부모 테이블이 먼저 있어야 만들 수 있다. PREPARE는 준비, 실행, 해제 순서가 한 묶음이다.
2 원본 예제 코드
USE sqldb; DROP TABLE IF EXISTS myTable; CREATE TABLE myTable (id INT AUTO_INCREMENT PRIMARY KEY, mDate DATETIME); SET @curDATE = CURRENT_TIMESTAMP(); PREPARE myQuery FROM 'INSERT INTO myTable VALUES(NULL, ?)'; EXECUTE myQuery USING @curDATE; DEALLOCATE PREPARE myQuery; SELECT * FROM myTable;
3 줄별 해석
| 구간 | 확인할 내용 | 실무 기준 |
|---|---|---|
| 테이블 생성 전 | DROP TABLE 순서와 참조 관계를 확인한다. | 자식 테이블을 먼저 삭제한다. |
| 테이블 생성 중 | 컬럼 타입, NULL 허용, 기본키를 분명히 적는다. | DESC 테이블명으로 확인한다. |
| 제약조건 추가 | PK/FK 이름과 대상 컬럼을 확인한다. | SHOW INDEX 또는 SHOW CREATE TABLE을 본다. |
| 동적 SQL 실행 | PREPARE, EXECUTE, DEALLOCATE 순서를 지킨다. | 준비 이름을 일관되게 쓴다. |
| 바인딩 사용 | ? 자리와 USING 변수 개수를 맞춘다. | 사용자 변수 @name을 사용한다. |
반응형
4 실행 흐름
1
목적 분류동적 SQL인지, 테이블 생성인지, 제약조건 추가인지 먼저 구분한다.
2
대상 객체 확인데이터베이스, 테이블, 컬럼 이름을 기존 구조와 맞춘다.
3
참조 순서 정리외래키가 있으면 부모 테이블을 먼저 만들고 자식 테이블을 나중에 만든다.
4
실행 후 검산DESC, SHOW INDEX, SELECT, COUNT로 결과를 확인한다.
5
정리 명령 실행PREPARE 문은 DEALLOCATE로 해제하고, 테스트 객체는 필요할 때 DROP한다.
5 용어 카드
PREPARESQL 문자열을 실행 가능한 문장으로 준비한다.
EXECUTE준비된 동적 SQL을 실행한다.
DEALLOCATE준비된 문장을 해제해 자원을 정리한다.
PRIMARY KEY행을 유일하게 식별하는 기본키 제약조건이다.
FOREIGN KEY다른 테이블의 키를 참조하는 외래키 제약조건이다.
REFERENCES외래키가 참조할 대상 테이블과 컬럼을 지정한다.
NOT NULL값이 반드시 들어와야 함을 의미한다.
AUTO_INCREMENT숫자 키를 자동으로 증가시킨다.
6 CREATE TABLE 기준
| 항목 | 의미 | 예시 |
|---|---|---|
| 컬럼명 | 데이터를 담는 필드 이름 | userID, prodName |
| 자료형 | 저장할 값의 종류와 길이 | CHAR(8), INT, DATE |
| NULL 여부 | 값 생략 가능 여부 | NOT NULL, NULL |
| 기본키 | 행을 식별하는 대표 컬럼 | PRIMARY KEY(userID) |
| 외래키 | 다른 테이블과의 참조 관계 | REFERENCES usertbl(userID) |
7 PREPARE 기준
PREPARE는 SQL 문자열을 실행 가능한 문장으로 만들고 EXECUTE로 실행한다. 실행 후에는 DEALLOCATE PREPARE로 해제해 같은 이름 재사용이나 자원 낭비 문제를 줄인다.
PREPARE stmtName FROM 'SELECT ... WHERE col = ?'; EXECUTE stmtName USING @value; DEALLOCATE PREPARE stmtName;
일반 지역 변수는 EXECUTE USING에 바로 쓰기 어렵다. 예제처럼 @curDATE 같은 사용자 변수를 사용하면 바인딩 흐름을 단순하게 확인할 수 있다.
8 제약조건 기준
| 제약조건 | 목적 | 오류가 나는 경우 |
|---|---|---|
| PRIMARY KEY | 중복 불가, NULL 불가 식별자 | 중복값 또는 NULL이 들어갈 때 |
| FOREIGN KEY | 부모 테이블에 있는 값만 허용 | 부모 테이블/컬럼이 없거나 타입이 다를 때 |
| NOT NULL | 필수 입력값 강제 | INSERT에서 값을 생략할 때 |
| AUTO_INCREMENT | 숫자 키 자동 증가 | 키 설계가 중복되거나 수동 입력과 충돌할 때 |
| CONSTRAINT 이름 | 제약조건을 관리하기 쉽게 식별 | 같은 이름이 이미 있을 때 |
9 자주 하는 실수
| 실수 | 증상 | 해결 |
|---|---|---|
| 부모 테이블보다 자식 테이블 먼저 생성 | FOREIGN KEY 생성 실패 | usertbl을 먼저 만들고 buytbl을 만든다. |
| DROP 순서 반대 | 참조 때문에 삭제 실패 | 자식 테이블을 먼저 삭제한다. |
| PREPARE 해제 누락 | 같은 이름 재사용 시 혼란 | DEALLOCATE PREPARE를 마지막에 실행한다. |
| ? 개수와 USING 변수 불일치 | EXECUTE 오류 | 자리표시자와 변수 개수를 맞춘다. |
| 복합키 순서 혼동 | 인덱스 활용이 기대와 다름 | 조회 조건에 맞는 컬럼 순서를 설계한다. |
10 검산 쿼리
DESC usertbl; DESC buytbl; SHOW INDEX FROM prodTbl; SHOW CREATE TABLE buytbl; SELECT COUNT(*) FROM myTable;
검산 쿼리는 생성 결과가 실제로 반영되었는지 확인하는 용도다. 문법이 성공해도 원하는 제약조건이 빠졌을 수 있으므로 구조 확인 명령을 함께 실행한다.
11 참조 순서
| 작업 | 권장 순서 | 이유 |
|---|---|---|
| 생성 | 부모 테이블 → 자식 테이블 | 외래키가 참조할 대상이 필요하다. |
| 삭제 | 자식 테이블 → 부모 테이블 | 참조 중인 부모를 먼저 지울 수 없다. |
| 제약 추가 | 데이터 정리 → ALTER | 기존 데이터가 제약을 위반하면 실패한다. |
| 동적 실행 | SET 변수 → PREPARE → EXECUTE | 바인딩 값이 먼저 준비되어야 한다. |
12 실무 메모
테이블 구조를 바꾸는 SQL은 한 번 실행하면 데이터 저장 방식에 영향을 준다. 그래서 테스트 데이터베이스에서 먼저 실행하고, 실제 환경에서는 백업과 롤백 방법을 확인한 뒤 적용한다.
동적 SQL은 편리하지만 문자열 조합이 많아질수록 디버깅이 어려워진다. 가능한 경우 바인딩을 사용하고, 실행할 SQL 문자열을 먼저 출력해 확인하는 습관이 좋다.
13 최종 체크리스트
| 체크 | 통과 기준 |
|---|---|
| 기존 제목 | HTML title을 변경하지 않았다. |
| 원본 코드 | md의 핵심 SQL을 포함했다. |
| 용어 | PREPARE, PK, FK 등 핵심 용어를 분리 설명했다. |
| 검산 | DESC, SHOW INDEX, SHOW CREATE TABLE 기준을 적었다. |
| 실수 | 참조 순서와 해제 누락 같은 오류를 정리했다. |
14 실습 순서 예시
1
데이터베이스 선택USE 문으로 작업 대상 데이터베이스를 명확히 고른다.
2
기존 객체 정리DROP TABLE IF EXISTS로 같은 이름의 테스트 테이블을 정리한다.
3
기본 구조 생성컬럼명, 자료형, NULL 여부를 먼저 확정한다.
4
제약조건 확인PRIMARY KEY와 FOREIGN KEY가 의도대로 들어갔는지 확인한다.
5
데이터 입력 테스트정상 입력과 실패해야 하는 입력을 나누어 테스트한다.
6
구조 출력DESC, SHOW INDEX, SHOW CREATE TABLE 결과를 남긴다.
15 오류 메시지 읽는 법
| 오류 유형 | 주된 원인 | 먼저 볼 것 |
|---|---|---|
| Cannot add foreign key constraint | 부모 테이블, 컬럼, 타입 불일치 | 부모 테이블 존재 여부와 컬럼 타입 |
| Duplicate key | PRIMARY KEY 값 중복 | 이미 들어간 키 값 |
| Column cannot be null | NOT NULL 컬럼에 NULL 입력 | INSERT 컬럼 목록과 값 |
| Unknown table | 테이블 이름 또는 DB 선택 오류 | USE 문과 SHOW TABLES |
| Incorrect arguments to EXECUTE | ? 개수와 USING 값 불일치 | PREPARE 문자열과 EXECUTE USING |
16 한 줄 복습
| 상황 | 기억할 문장 |
|---|---|
| 동적 SQL 실행 | PREPARE → EXECUTE → DEALLOCATE |
| 값 바인딩 | ? 자리에 EXECUTE ... USING @변수 |
| 부모-자식 생성 | 부모 테이블 먼저, 자식 테이블 나중 |
| 부모-자식 삭제 | 자식 테이블 먼저, 부모 테이블 나중 |
| 복합 기본키 | PRIMARY KEY (컬럼1, 컬럼2) |
| 구조 검산 | DESC와 SHOW CREATE TABLE을 같이 확인 |
핵심 요약
주제PREPARE 바인딩
핵심물음표 자리표시자에 USING 값으로 INSERT하는 패턴
순서생성은 부모 먼저, 삭제는 자식 먼저, PREPARE는 준비 후 실행 후 해제다.
검산DESC, SHOW INDEX, SHOW CREATE TABLE로 구조를 확인한다.
주의외래키 참조 대상과 바인딩 변수 개수를 반드시 맞춘다.
Tags
#MySQL #PREPARE #CREATE TABLE #PRIMARY KEY #FOREIGN KEY #CONSTRAINT #SQL #티스토리
티스토리 태그 입력용
MySQL, PREPARE, CREATE TABLE, PRIMARY KEY, FOREIGN KEY, CONSTRAINT, SQL, 데이터베이스, DB, 티스토리
반응형
'php' 카테고리의 다른 글
| MySQL CREATE TABLE NOT NULL · PK — 제약조건 명시 완전 정리 (0) | 2026.06.29 |
|---|---|
| MySQL ALTER ADD CONSTRAINT — PK 제약조건 추가 완전 정리 (0) | 2026.06.29 |
| MySQL PREPARE · EXECUTE · DEALLOCATE — 동적 SQL 완전 정리 (0) | 2026.06.29 |
| MySQL CREATE TABLE FK 오류 — 참조 순서 완전 정리 (0) | 2026.06.29 |
| MySQL CREATE TABLE 기본 — 테이블 생성 완전 정리 (0) | 2026.06.29 |
왕진 블로그

댓글