Skip to content

Data Editing

Sangyong Bae edited this page Sep 27, 2026 · 2 revisions

결과 그리드에서 데이터 편집

단일 테이블을 조회한 결과는 그리드에서 바로 고칠 수 있습니다. 고친 내용은 적용(✓) 을 누를 때까지 서버에 가지 않고, 적용은 한 트랜잭션으로 묶여 하나라도 실패하면 전부 되돌아갑니다.

언제 편집할 수 있나

결과 편집
SELECT a, b FROM t · SELECT * FROM t WHERE … · SELECT t.a FROM t t 가능
JOIN · GROUP BY · DISTINCT · UNION · 서브쿼리 FROM · 식/별칭 열(a+1, a AS x) 읽기 전용(상태줄에 이유)
뷰 · 프로시저 결과 · 커서 · 운영(PROD) 접속 · 설정 grid.edit 끔 읽기 전용

행을 서버에서 정확히 하나 찾을 수 있어야 합니다. Nexa SQL은 다음 순서로 방법을 정합니다.

등급 조건 무엇으로 찾나
1급 PK 또는 UNIQUE 열이 결과에 전부 있다 그 키 열(원본 값)
1급-보완 키는 있는데 결과에서 빠졌다(SELECT name FROM emp) 키 열을 숨은 열로 덧붙여 한 번 다시 조회(화면에는 안 보임 · grid.edit_hidden_keys)
2급 키가 없다 DBMS 행 식별자를 숨은 열로 덧붙여 한 번 다시 조회 — Oracle ROWID · SQLite rowid · PostgreSQL ctid+xmin(grid.edit_rowid) · SQL Server/MySQL은 없음
3급 키도 행 식별자도 없다 비교 가능한 모든 열의 원본 값(LOB·실수·긴 문자·xml/json·공간형 제외 · grid.edit_all_cols)
읽기 전용 위 어느 것도 안 된다 —

숨은 열은 복사·텍스트 보기·⌘A/Ctrl+A 어디에도 나오지 않고 WHERE 절에만 쓰입니다. 다시 조회에 실패하면(예: SQLite WITHOUT ROWID 표) 원래 문장으로 돌아가 3급으로 판정합니다.

편집 방법

동작 키·마우스
편집 시작 Enter · 더블클릭 · 그냥 타이핑(첫 글자로 시작)
확정 Enter(아래 셀로) · Tab / Shift+Tab(오른쪽/왼쪽 셀로) · 다른 셀 클릭
취소 Esc
셀 비우기 / NULL Delete · Backspace(빈 값 = NULL은 grid.edit_empty) · 우클릭 ▸ Set NULL
셀 이동(편집기 밖) 화살표 · Tab / Shift+Tab
행 추가 · 복제 · 삭제 툴바 + ⧉ − · 우클릭 메뉴(삭제는 표시만 · 적용 때 DELETE) — 복제·삭제는 셀을 하나 고른 뒤 켜집니다(행 추가는 언제나)
붙여넣기 ⌘V/Ctrl+V — 탭·줄 구분 행렬을 선택 셀부터 채움(행이 모자라면 자동 추가 · 상한 grid.paste_max_rows)
되돌리기 / 다시 하기 ⌘Z/Ctrl+Z · ⌘⇧Z/Ctrl+Y(그리드 편집 전용 이력)
변경 목록 · SQL 미리보기 우클릭 ▸ Changes / Preview SQL(보낼 문장을 리터럴로)
적용 · 전부 되돌리기 툴바 ✓ / ✕

편집 중인 셀은 표시 글자와 같은 자리에 상자가 열리고 긴 글은 첫머리부터 보입니다. 상자 안에서 더블클릭은 단어, 세 번 클릭은 전체 선택입니다(editor.dblclick · editor.triple_click · editor.dblclick_underscore).

표시

  • 바뀐 셀 = 글자색 주황 + 굵게(배경은 살짝만). 값을 고쳤다가 원래 값으로 되돌리면 바뀐 것으로 치지 않습니다(A → B → A = 변경 없음).
  • 행 띠: 추가 행 초록 · 바뀐 행 강조색 · 삭제 행 빨강 + 취소선 · 적용에 실패한 행 붉은 배경.
  • 푸터에 수정 n · 추가 m · 삭제 k — 적용 시 트랜잭션 범위입니다.

적용과 안전 규칙

적용(✓)은 DELETE → 키 열을 바꾸는 UPDATE → 나머지 UPDATE → INSERT 순서로 바인드 문장을 만들어 한 트랜잭션에 보냅니다. 데이터 보호를 위해 다음은 설정으로 끌 수 없습니다.

  1. 사전 검사 — UPDATE/DELETE마다 같은 WHERE로 SELECT COUNT(*)를 먼저 실행해 대상 행이 정확히 1이 아니면 아무것도 쓰지 않습니다(완전히 같은 행이 둘 있는 3급 표 등).
  2. 영향 행 수 1 — 실행한 문장이 1행이 아니면 즉시 중단.
  3. 되돌림 — 자동 커밋이면 전체 롤백 · 수동 커밋이면 세이브포인트로 되돌리고 필요하면 "ROLLBACK 필요"를 알립니다.
  4. 키 중복 사전 검사 — 적용 대기 변경 안에서 같은 키가 둘 이상이 되면 적용 전에 거부합니다.

실패하면 어느 문장(UPDATE #3 (ID=5))이 어느 단계에서 왜 실패했는지 상태줄·로그·토스트에 그대로 적습니다.

적용 뒤 화면 갱신(grid.edit_refresh)

값 동작
rows(기본) 바뀐 행만 키로 다시 읽어 제자리에서 교체 · 추가 행은 그 자리에 실제 행으로 · 삭제 행 제거 · 스크롤·정렬·선택 유지. 행을 식별할 수 없으면(시퀀스 키 · PostgreSQL ctid 등) 조회 전체를 다시 실행
requery 늘 조회 전체 다시 실행
local 다시 읽지 않고 편집한 값을 그대로 둠(서버 기본값·트리거 결과는 모름)

동시성(grid.edit_concurrency)

값 WHERE에 더 비교하는 것
key(기본) 키만
key_old 키 + 내가 고친 열의 옛 값
all_old 키 + 비교 가능한 모든 열의 옛 값

다른 세션이 먼저 바꿨으면 사전 검사가 0행을 보고 아무것도 쓰지 않습니다.

큰 값(LOB) — 값 보기 창

셀을 고르고 우클릭 ▸ View value(또는 Enter로 편집 대신 값 창)를 열면 값을 따로 봅니다.

값 창 할 수 있는 것
글(CLOB · TEXT · 긴 문자열) Text(편집 가능 셀이면 그대로 편집) 셀에 반영(저장은 ✓ 적용) · 파일에서 넣기 · 파일로 저장 · 복사
이진(BLOB · BYTEA · varbinary) Hex(16진수 덤프) / Image(PNG·BMP·GIF 미리보기) 파일에서 넣기(파일 그대로 셀에 · 라벨 <파일 · n bytes>) · 파일로 저장(바이트 그대로)
JPEG(기저) 미리보기(회색·YCbCr · 서브샘플링 · 재시작 간격) 프로그레시브 JPEG는 안내만
프로그레시브 JPEG/WebP 형식은 알려 주지만 미리보기는 없음 파일로 저장해서 봅니다

상한 grid.lob_view_max_mb(16)를 넘는 값은 풀지 않고 16진수 앞부분만 보이며, grid.lob_image_preview를 끄면 이진은 늘 16진수입니다. 4,000자를 넘는 글과 이진은 CLOB/BLOB 타입으로 바인드해 저장합니다(Oracle VARCHAR2 4000 · SQL Server NVARCHAR(4000) 상한 회피).

여러 행을 파일에서 한꺼번에 넣으려면 파일로 넣기·내보내기를 보세요(그리드 편집은 한 행씩 안전하게, 대량 적재는 INSERT 전용입니다).

관련 설정

grid.edit · grid.edit_empty · grid.edit_refresh · grid.edit_hidden_keys · grid.edit_rowid · grid.edit_all_cols · grid.edit_concurrency · grid.paste_max_rows · grid.lob_view_max_mb · grid.lob_image_preview · tx.prod_*(운영 접속은 편집 불가).

기술 문서: 저장소 docs/87-grid-data-editing.md(설계 · 행 식별 등급 · 데이터 보호 불변식).

행 식별 재조회는 기본으로 하지 않습니다 (2026-09-27)

키가 없는 표를 조회하면 예전에는 편집 준비를 위해 자동으로 한 번 더 조회(ROWID/빠진 키 열 주입)했습니다. 이제 기본은 재조회 없음입니다 — 결과에 PK/UNIQUE 열이 있으면 그대로 편집되고, 없으면 모든 컬럼 값으로 행을 맞춰 편집합니다(문장마다 정확히 1행인지 사전 검사).

더 정확한 행 식별(ROWID·키 열)이 필요하면 결과 그리드에서 편집 툴바 ⚿ 행 식별 열 가져오기(재조회 1회) 를 고르세요 — 그 결과에만 적용됩니다. 항상 켜려면 설정 grid.edit_rowid / grid.edit_hidden_keys를 on으로.

Clone this wiki locally