에러 발생 상황
1. 게시글 테이블의 visible column은 default가 null 값으로, null이면 게시글이 보이고 'HIDE', 'DELETE' 타입이면 각각 숨김, 삭제가 되도록 구현된 상태
2. visible column에 null 값을 default로 하지 않기로 결정해 'VISIBLE' 타입을 추가하기로 결정
3. code단에서 enum 타입에 'VISIBLE' 추가
@Getter
public enum Visible {
HIDE, DELETE, VISIBLE;
}
4. 추가 후 테스트 결과 에러 발생
ERROR: new row for relation "board" violates check constraint "board_visible_check"
에러 해결
* PostgreSQL에서 'violates check'는 데이터베이스의 CHECK 제약조건을 위반하는 경우에 발생하는 오류
* CHECK 제약 조건 : 데이터베이스 테이블에 대한 특정 조건이나 규칙을 정의하는데 사용하고, 데이터의 무결성을 보장
- CHECK 제약 조건 확인 방법
SELECT constraint_name, constraint_type, check_clause
FROM information_schema.table_constraints
WHERE table_name = 'your_table';
위의 쿼리를 조회해봤지만 조회가 되지 않았음 .. 그래서 PostgreSQL 툴에서 확인함
- Catalogs > Information_schema > CatalogObjects > table_constraints 에서 board_visible_check 제약조건 확인
- Catalogs > Information_schema > CatalogObjects > check_constraints
- check_clause에 (((visible)::text = ANY ((ARRAY['HIDE'::character varying, 'DELETE'::character varying])::text[]))) 로 설정되어있는 것 확인
- visible 컬럼이 'HIDE', 'DELETE' 값 중 하나와 일치해야 한다는 제약 조건이라서 해당 제약 조건에 'VISIBLE' 추가
- 제약조건 수정 쿼리
-- 1. 기존 CHECK 제약 조건 삭제
ALTER TABLE board DROP CONSTRAINT board_visible_check;
-- 2. 새로운 CHECK 제약 조건 추가 (visible 열 값이 'HIDE', 'DELETE', 'VISIBLE' 중 하나여야 함)
ALTER TABLE board
ADD CONSTRAINT board_visible_check CHECK (visible::text = ANY (ARRAY['HIDE'::character varying, 'DELETE'::character varying, 'VISIBLE'::character varying]));
-- 3. visible 열의 기본값을 'VISIBLE'로 설정
ALTER TABLE board
ALTER COLUMN visible SET DEFAULT 'VISIBLE';
- 제약 조건 수정 후 오류 해결 완료!