본문으로 건너뛰기

데이터 수정 및 삭제

출시 예정

데이터베이스는 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();