데이터 수정 및 삭제
출시 예정
데이터베이스는 2026년 1월 출시 예정입니다.
데이터베이스에 저장된 데이터를 수정하거나 삭제하는 방법을 설명합니다.
성능 주의
Where 절을 사용하여 대상을 특정할 때, 인덱스(Index)나 기본 키(PrimaryKey)를 사용하지 않으면 테이블 전체를 탐색하는 풀 스캔(Full Scan) 방식으로 처리됩니다.
데이터가 많아질수록 작업 속도가 느려질 수 있으므로 주의가 필요합니다. 인덱스 생성 가이드
데이터 수정 (Update)
데이터를 수정하려면 먼저 대상을 특정한 후 Update 메서드를 호출해야 합니다.
단일 객체 수정
일반적으로 데이터를 조회한 후, 값을 변경하고 다시 저장하는 방식을 사용합니다.
// 1. 수정할 유저 조회
var user = await DBClient.From<User>()
.Where(x => x.Username == "user_001")
.FirstOrDefault();
if (user != null)
{
// 2. 값 변경
user.Level = 5;
user.Experience = 1000;
user.LastLogin = DateTime.UtcNow;
// 3. 변경된 내용 저장 (ID를 기준으로 업데이트)
await DBClient.From<User>()
.Where(x => x.Id == user.Id)
.Update(user);
}
조건부 일괄 수정
특정 조건에 맞는 데이터를 한 번에 수정할 수도 있습니다.
// 비활성 유저를 모두 활성화 상태로 변경
var updateTemplate = new User { IsActive = true };
await DBClient.From<User>()
.Where(x => x.IsActive == false)
.Update(updateTemplate); // 주의: 설정된 필드만 업데이트됩니다.
산술 연산자 (Inc / Dec)
데이터를 조회하지 않고 직접 숫자 필드를 증가(Increment)하거나 감소(Decrement)할 수 있습니다.
언제 사용하나요?
- 카운터/누적치 갱신
- 소모/차감 처리
- 동시성 환경
Update()로 값을 직접 덮어쓰는 방식은 보통 조회 → 값 계산 → 저장 흐름이 필요합니다. 반면 Inc()/Dec()는 서버에서 증감 연산을 바로 적용하므로, 값 덮어쓰기 방식보다 충돌 가능성을 줄일 수 있습니다.
핵심 포인트
- 조회 없이 증감: 네트워크/처리 비용 감소
- 원자적(Atomic) 처리: 한 번의 실행으로 여러 필드를 함께 갱신
예시: 점수 및 전적 반영 (Inc / Dec)
[Table("battle_record", TableType.UserTable)]
public class BattleRecord : BaseModel
{
[PrimaryKey]
[Column(NotNull = true)]
public string InDate { get; set; } // 유저 식별자 (inDate)
[Column(NotNull = true, DefaultValue = "1000")]
public int MMR { get; set; } = 1000;
[Column(NotNull = true, DefaultValue = "0")]
public int Wins { get; set; } = 0;
[Column(NotNull = true, DefaultValue = "0")]
public int Losses { get; set; } = 0;
}
// 승리 처리 예시: 내 점수/승리 증가, 상대 점수/패배 증가
await DBClient.From<BattleRecord>()
.Where(x => x.InDate == myInDate)
.Inc(x => x.MMR, scoreChange)
.Inc(x => x.Wins, 1)
.Exec();
await DBClient.From<BattleRecord>()
.Where(x => x.InDate == opponentInDate)
.Dec(x => x.MMR, scoreChange)
.Inc(x => x.Losses, 1)
.Exec();
사용 규칙 및 주의사항
- 숫자 필드만 지원:
int,long,float,double등 숫자 타입 컬럼에만 사용하세요. - 반드시
Exec()호출:Inc()/Dec()를 체이닝한 뒤Exec()를 호출해야 실제로 반영됩니다.
데이터 삭제 (Delete)
Delete 메서드를 사용하여 조건에 맞는 데이터를 삭제합니다.
단일 삭제
// ID가 특정 값인 유저 삭제
await DBClient.From<User>()
.Where(x => x.Id == targetId)
.Delete();
조건부 일괄 삭제
// 레벨이 1 미만인 모든 유저 삭제
await DBClient.From<User>()
.Where(x => x.Level < 1)
.Delete();
// 이름에 "guest"가 포함된 유저 삭제
await DBClient.From<User>()
.Where(x => x.Username.Contains("guest"))
.Delete();