기본 키 이름을 바꾸고 싶을 때
기본 키의 경우 보통 @Column(name = "chat_id")
등으로 Springboot에서 맵핑 가능한데, 문제는 이 코드는 이미 DB에 존재하는 칼럼이랑 맵핑해주는 코드이다. 그래서 이미 존재하는 기본키 칼럼명을 바꾸어주는 코드가 아니다(ddl-auto: create
로 하지 않은 이상). DB에서 수동으로 바꾸어주고, 그 다음에 맵핑을 해주어야 한다.
이때 대부분 @GeneratedValue(strategy = GenerationType.IDENTITY)
코드를 통해서 자동 증가를 기본키에 설정해줬을 것이므로, 이 설정을 그대로 유지하기 위해서는 SQL문 뒤에 AUTO_INCREMENT
를 붙여야 한다.
ALTER TABLE [테이블명] CHANGE COLUMN [원래칼럼명] [바꾸고싶은칼럼명] BIGINT NOT NULL AUTO_INCREMENT;
ENUM 타입 이름을 바꾸고 싶을 때
Springboot에서 설정한 enum
타입이 있다고 할때, enum 타입 이름을 바꾸더라도 ddl-auto: create
가 아니면 코드에서 변경된 타입 이름이 DB에도 반영이 되지 않는다. 수동으로 DB에 SQL을 통해서 타입명을 바꿔줘야 한다. 처음부터 타입명에 오타를 만들지 않는 게 중요하다.
ALTER TABLE [테이블명] CHANGE [ENUM컬럼명] [ENUM컬럼명] ENUM('타입1','타입2', '타입3');
LONGTEXT로 바꾸고 싶을 때
보통 Springboot에서 String으로 설정한 필드는 varchar(255)
로 설정되는 것 같다. 이 경우에는 긴 텍스트를 DB에 저장하려고 하면 에러가 발생한다. LONGTEXT
유형으로 바꿔주면 텍스트가 너무 길어서 저장이 안되는 문제는 거의 없는 것 같다.
ALTER TABLE [테이블명] MODIFY [칼럼명] LONGTEXT;
일대일 연관관계를 일대다로 변경하고 싶을 때
Springboot에서 연관관계를 일대일로 설정하면(@OneToOne
), MySQL에서는 외래 키 제약 조건과 고유 키 제약 조건 두 가지를 생성한다. 외래 키 제약 조건은 "해당 필드가 특정 table의 어떤 필드를 참조해야 한다"는 조건이고, 고유 키 제약 조건은 "해당 필드는 Unique해야 한다"는 조건이다.
@Entity
에서 연관관계를 일대다로 변경하고(@OneToMany
), ddl-auto: create
로 업데이트해줘도 이 제약 조건이 자동으로 삭제되는 것은 아니다. 따라서 직접 쿼리를 만들어서 제약 조건을 없애줘야 한다.
create table schedule
(
chat_id bigint null,
constraint <고유 키 제약 조건>
unique (chat_id),
constraint <외래 키 제약 조건>
foreign key (chat_id) references chat (chat_id),
);
외래 키 제약 조건이 있는 필드는 변경 불가능하므로, 먼저 외래 키를 DROP하고 고유 키 제약 조건을 삭제해 준 후, 다시 외래 키 제약 조건을 만들어주면 된다.
ALTER TABLE schedule DROP FOREIGN KEY <외래 키 제약 조건>;
ALTER TABLE schedule DROP INDEX <고유 키 제약 조건>;
ALTER TABLE schedule
ADD CONSTRAINT <외래 키 제약 조건>
FOREIGN KEY (chat_id) REFERENCES chat (chat_id);