만족
[MYSQL] SQL CREATE/DROP/ALTER 본문
[MYSQL] SQL CREATE/DROP/ALTER
DataBase/mysql Satisfaction 2021. 4. 25. 21:46테이블의 생성: CREATE
CREATE TABLE 테이블이름(
열이름1 타입 [키 타입] [기본값] [on update 값],
열이름2 타입 [키 타입] [기본값] [on update 값],
...
[constraint 제약사항 이름 check(조건식)],
...
);
[]로 된 부분은 선택사항이다.
위 문법을 이용해 간단한 테이블을 생성해보자
CREATE TABLE student(
student_id integer PRIMARY KEY,
student_name varchar(3) NOT NULL,
semester int integer DEFAULT 1,
enter_date datetime DEFAULT NOW() ON UPDATE NOW(),
constraint SEMESTER_CONST check(semester>=1 AND semester<=8)
);
student테이블을 만들 것인데,
열은 student_id(정수 타입, 기본키), student_name(최대 길이 3 문자열, 널 허용 안함), semester(정수 타입, 기본값 1), enter_date(datetime;날짜+시간 타입, 기본값 NOW();현재날짜+시간, 해당 열이 업데이트될 경우 enter_date를 NOW()로 자동 업데이트) 이고,
제약사항은 grade가 1 이상, 4 이하여야 한다.
제약사항에는 SEMESTER_CONST라는 이름을 붙였는데, 이는 나중에 이 테이블의 제약사항을 수정할 때 사용된다.
이 방법은 열을 선언할 때 너무 길어질 수 있다는 단점이 있는데,
실제 프로덕션 레벨에서는 열에 키나 기본값, 옵션이 혼재되어 매우 복잡해질 수 있다.
열의 키 타입을 아래에 몰아서 선언할 수도 있다.
CREATE TABLE 테이블이름(
열이름1 타입 [기본값] [on update 값],
열이름2 타입 [기본값] [on update 값],
...
[PRIMARY KEY (열 이름1, ...),]
[UNIQUE (열 이름2, ...),]
[FOREIGN KEY (열 이름 3, ...)
REFERENCE 테이블명[(해당 테이블의 열 이름, ...)]
[ON DELETE 옵션]
[ON UPDATE 옵션]
,]
...
[constraint 제약사항 이름 check(조건식)],
...
);
이 방법을 사용해 또 하나의 테이블을 만들어 보자
CREATE TABLE exam_result(
course_id integer,
student_id integer,
grade char(1),
PRIMARY KEY(course_id, student_id),
FOREIGN KEY(stuent_id) REFERENCES student(student_id)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINTS GRADE_CONST CHECK(grade>='A' AND grade<='F')
)
PRIMARY KEY 타입 선언부를 보면
course_id와 student_id가 하나로 묶여 기본키를 이루고 있다.
(course_id와 student_id가 모두 같은 튜플은 존재할 수 없다)
FOREIGN KEY를 보면
현재 테이블의 student_id 컬럼이 student테이블의 student_id를 참조한다는 것을 알 수 있다.
ON UPDATE와 ON DELETE는 참조하는 키가 변경되거나 삭제되었을 떄의 동작을 한다.
만약 student테이블의 student_id가 123인 튜플이 변경되거나 삭제되었을 때는
ON UPDATE CASCADE ON DELETE CASCADE이므로 exam_result테이블의 student_id도 같은 값으로 바뀐다.
옵션으로 CASCADE, SET DEFAULT, SET NULL이 있다.
CASCADE | 참조 값이 삭제/변경되었을 때 동일하게 삭제/변경한다. |
SET DEFAULT | 참조 값이 삭제/변경되었을 때 현재 테이블의 해당 열을 DEFAULT 값으로 바꾼다 |
SET NULL | 참조 값이 삭제/변경되었을 때 현재 테이블의 해당 열을 NULL 값으로 바꾼다 |
테이블의 수정: ALTER
ALTER TABLE 테이블이름(
[ADD 추가할열이름 타입 [DEFAULT 기본값], ...)
[DROP 제거할열이름 [CASCADE|RESTRICT], ...]
[MODIFY 수정할열이름 타입 [DEFAULT 값], ...]
);
DROP과 MODIFY에서 사용하는 열 이름은 반드시 현재 테이블에 존재하는 열 이름을 입력해야 한다.
DROP시 CASCADE옵션을 줄 경우, 해당 키를 참조하는 외래 테이블을 열까지 전부 삭제하고,
RESTRICT 옵션을 줄 경우, 해당 키를 참조하는 외래 테이블의 열이 있을 경우 오류를 발생시킨다.
MODIFY시 만약 현재 행이 존재한다면,
값이 절삭되거나(소수였는데 정수로 변환 시 소수점 값 손실)
변환에 실패(문자열이였는데 정수로 변환 시 실패)할 수도 있다.
ADD에서 사용하는 열 이름은 반드시 현재 테이블에 존재하지 않는 열 이름을 입력해야 한다.
아까 만든 student 테이블을 다시 보자.
CREATE TABLE student(
student_id integer PRIMARY KEY,
student_name varchar(3) NOT NULL,
semester int integer DEFAULT 1,
enter_date datetime DEFAULT NOW() ON UPDATE NOW(),
constraint SEMESTER_CONST check(semester>=1 AND semester<=8)
);
여기서 student_name은 최대 3글자인데, 만약 이름이 4글자인 '홍길동동'이라는 학생이 새로 왔다고 해보자.
그러면 이름 최대 길이를 늘려주어야 하므로,
ALTER TABLE student(
MODIFY student_name varchar(4) NOT NULL
);
로 4글자까지 받을 수 있도록 변경한다.
물론 4글자도 부족하겠지만 일단은 4글자가 최대길이라고 해두자.
테이블의 삭제: DROP
DROP TABLE 삭제할테이블이름 [{RESTRICT | CASCADE}];
테이블 삭제 시, RESTRICT나 CASCADE 옵션을 줄 수 있다.
만약 RESTRICT 옵션을 사용하면, 삭제할 테이블을 참조하는 다른 테이블이 있다면 실행에 실패한다.
만약 CASCADE 옵션을 사용하면, 해당 테이블을 참조하는 테이블도 전부 삭제한다.
=> CASCADE는 주의해서 사용해야 한다.
'DataBase > mysql' 카테고리의 다른 글
[MYSQL] 조인(JOIN) (0) | 2021.04.26 |
---|---|
[MYSQL] Aggregtion(집계)과 GROUP(그룹) (0) | 2021.04.26 |
[MYSQL] 셀렉트(SELECT) - 2 (0) | 2021.04.26 |
[MYSQL] 셀렉트(SELECT) - 1 (0) | 2021.04.26 |
[MYSQL] RANK/DENSE_RANK/ROW_NUMBER 함수 (0) | 2021.03.03 |