떤 숫자를 10으로 나눈 나머지는 항상 마지막 자릿수(일의 자리)가 됩니다
cmd에서 mySQL 바로 접속하는 방법:
mysql -u root -p
1주차 숙제
문제1.
CREATE TABLE manager
(
id bigint primary key,
name varchar(100) not null check (length(name) >= 2),
student_code varchar(100) not null,
constraint manager_fk_student_code
foreign key (student_code)
references student(student_code)
);
2번문제
잘못 알고 있던 사실
처음에는 이렇게 시도를 하려고 했다.
ALTER TABLE manager ADD CONSTRAINT id AUTO_INCREMENT;
하지만 이 방법은 잘못 됐다.
ADD CONSTRAINT는 PK, FK, UNIQUE, CHECK 같은 제약 조건을 추가할 때 쓰는 문법이다.
AUTO_INCREMENT는 제약조건이 아니라 컬럼 속성이다. 따라서 문법적으로 맞지 않아서 에러가 난다.
AUTO_INCREMENT를 추가하려면 애초에 테이블을 CREATE할 때
CREATE TABLE manager (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
student_code VARCHAR(100) NOT NULL
);
이렇게 추가하거나 아니면 이미 존재하는 테이블에 나중에 추가하려면
MODIFY와 함께 사용해야 한다.
ALTER TABLE manager
MODIFY id BIGINT AUTO_INCREMENT;
단순히 AUTO_INCREMENT만 덧붙이는 게 아니라 기존 타입/NOT NULL 여부/기본값까지 전부 재정의하는 형태로 동작한다. 그래서 MODIFY id AUTO_INCREMENT;처럼 타입을 빼면 문법 오류가 난다.
2번 문제 정답
ALTER TABLE manager MODIFY id BIGINT AUTO_INCREMENT;
3번 문제 정답
INSERT INTO MANAGER (name, student_code) VALUES('managerA', 's1');
INSERT INTO MANAGER (name, student_code) VALUES('managerA', 's2');
INSERT INTO MANAGER (name, student_code) VALUES('managerA', 's3');
INSERT INTO MANAGER (name, student_code) VALUES('managerA', 's4');
INSERT INTO MANAGER (name, student_code) VALUES('managerA', 's5');
INSERT INTO MANAGER (name, student_code) VALUES('managerB', 's6');
INSERT INTO MANAGER (name, student_code) VALUES('managerB', 's7');
INSERT INTO MANAGER (name, student_code) VALUES('managerB', 's8');
INSERT INTO MANAGER (name, student_code) VALUES('managerB', 's9');
4번 문제 내가 쓴 정답
SELECT STUDENT.NAME, EXAM.SCORE
FROM STUDENT, EXAM, MANAGER
WHERE STUDENT.STUDENT_CODE = MANAGER.STUDENT_CODE;
5번 문제 정답
처음에 생각한 잘못된 답
ALTER TABLE EXAM DROP COLUMN STUDENT.STUDENT_CODE CASCADE CONSTRAINT;
내가 잘못 알고 있던 점: MySQL/InnoDB에서는 기존 FK 제약의 옵션(ON DELETE/UPDATE, MATCH, DEFERRABLE 등)을 “수정”할 수 없어서 반드시 DROP → ADD(재생성) 해야 한다.
일부 DB(예: SQL Server의 ALTER TABLE ... WITH CHECK 재검증, Oracle의 일부 제약 옵션 변경 등)는 부분 변경이 가능한 경우가 있지만, MySQL은 예외 없이 드롭/재생성이 표준 루트
수정한 답
-- 2) 기존 FK 드롭
ALTER TABLE manager
DROP FOREIGN KEY manager_fk_student_code;
-- 3) 원하는 동작(ON DELETE CASCADE 등) 포함해 재생성
ALTER TABLE manager
ADD CONSTRAINT manager_fk_student_code
FOREIGN KEY (student_code)
REFERENCES student(student_code)
ON DELETE CASCADE;
숙제 해설
#문제 1
CREATE TABLE IF NOT EXISTS MANAGER
(
id bigint primary key,
name varchar(100) not null,
student_code varchar(100) not null,
CONSTRAINT manager_fk_student_code foreign key(student_code) references STUDENT(student_code)
);
#문제2
ALTER TABLE MANAGER MODIFY COLUMN id bigint auto_increment;
#문제3
INSERT INTO MANAGER(name, student_code) VALUES ('managerA', 's1');
INSERT INTO MANAGER(name, student_code) VALUES ('managerA', 's2');
INSERT INTO MANAGER(name, student_code) VALUES ('managerA', 's3');
INSERT INTO MANAGER(name, student_code) VALUES ('managerA', 's4');
INSERT INTO MANAGER(name, student_code) VALUES ('managerA', 's5');
INSERT INTO MANAGER(name, student_code) VALUES ('managerB', 's6');
INSERT INTO MANAGER(name, student_code) VALUES ('managerB', 's7');
INSERT INTO MANAGER(name, student_code) VALUES ('managerB', 's8');
INSERT INTO MANAGER(name, student_code) VALUES ('managerB', 's9');
#문제4
SELECT s.name, e.exam_seq, e.score
FROM MANAGER m JOIN STUDENT S ON m.student_code = s.student_code
JOIN EXAM e on s.student_code = e.student_code
WHERE m.name = 'managerA';
#문제5
ALTER TABLE EXAM DROP CONSTRAINT exam_fk_student_code;
ALTER TABLE EXAM ADD CONSTRAINT exam_fk_student_code
FOREIGN KEY(student_code) references STUDENT(student_code) on DELETE cascade;
ALTER TABLE MANAGER ADD CONSTRAINT manager_fk_student_code
FOREIGN KEY(student_code) references STUDENT(student_code) on DELETE cascade;'🖥️Backend Development > Spring Boot' 카테고리의 다른 글
| [TIL-2] 데이터베이스 연동과 Spring MVC의 핵심 (0) | 2025.09.17 |
|---|---|
| [TIL-1] 스프링 부트 개발 여정의 첫걸음: 환경 구축부터 HTTP 통신까지 (1) | 2025.09.15 |