뜽배 2025. 2. 25. 19:20
728x90
반응형
postgresql의 애러 해결 발생 원인과 해결방안에 대해서 알아 보자.
 

1. 애러코드

SQL Error [23514]: ERROR: updated partition constraint for default partition "<파티션 테이블 명>" would be violated by some row

 

2. 애러원인

위 애러는 postgresql에서 파티션테이블을 추가할 때, default partition이 존재하고
그 내용이 현재 추가하려는 파티션의 조건과 충돌할 경우 발생한다.
예를들어
-- 현재 파티션을 조회했을 때
SELECT
	inhparent::regclass AS parent_table,
	inhrelid::regclass AS partition_table
FROM pg_inherits;

위와 같이 현재 구성이 되어있다.

 

partition_test_default 테이블에 데이터의 range column의 데이터가 2025-03 이다.
이때 자식 partition 테이블 2025-03을 생성했을 경우에 위와 같은 애러가 발생한다.
 

3. 해결방법

임시테이블을 만들어서 partition_test_default의 데이터를 밀어넣는다.
-- 임시테이블 생성
create temp table temp_table
(like partition_test including all);

-- 데이터 마이그레이션
INSERT INTO temp_table (INF_KEY,DATA_INPUT_TIME, VALUE1, VALUE2, VALUE3 )
SELECT 
	* 
FROM partition_test_default
WHERE DATA_INPUT_TIME >= '2025-03-01'
AND DATA_INPUT_TIME < '2025-04-01';
 
기존에 존재하던 default 테이블을 삭제한다.
-- partition_test_default테이블 삭제
drop table partition_test_default;
 

신규로 partition테이블을 생성한다.

-- 2025-03 partition 테이블 생성
create table partition_test_202503 partition of partition_test
for values from ('2025-03-01') to ('2025-04-01');

create unique index pk_partition_test_202503 on partition_test_202503(inf_key);
 
그리고 default partiton table도 다시 생성해준다.
-- partition_test_default 테이블 생성
create table partition_test_default partition of partition_test default;
create unique index pk_partition_test_default on partition_test_default(inf_key);
 

temp table로 백업했던 데이터를 insert 해준다.

-- temp_table -> partition_test_default테이블 재 마이그레이션
INSERT INTO partition_test (INF_KEY,DATA_INPUT_TIME, VALUE1, VALUE2, VALUE3 )
SELECT * FROM temp_table;
 

temp테이블은 삭제한다.

-- temp_table삭제
drop table temp_table;

 

- 끝

728x90
반응형