🖥️Backend Development/Spring Boot

[TIL-3] 데이터베이스 연동

카멜필름 2025. 9. 19. 22:33

 

 

떤 숫자를 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;
728x90
LIST