키 보존 테이블(Key-Preserved Table) 은 View(뷰)에서 특정 테이블의 기본 키(Primary Key)가 유지되는 테이블을 의미합니다. (뷰에 rowid를 제공하는 테이블)
즉, 뷰를 통해 SELECT, INSERT, UPDATE, DELETE 작업을 수행할 때, 기본 키(Primary Key)가 그대로 유지되는 테이블을 말합니다.
📌 주요 개념:
Oracle에서 뷰(View)를 사용하면 데이터를 읽기 전용(READ-ONLY) 으로 볼 수 있습니다.
그러나 일부 뷰에서는 INSERT, UPDATE, DELETE 같은 DML(데이터 조작) 작업이 허용됩니다.
이때, 키 보존 테이블이 포함된 뷰에서만 해당 테이블의 데이터 수정이 가능합니다.
✅ 즉, 키 보존 테이블이 아니면 뷰를 통해 DML을 실행할 수 없음!
뷰가 단일 테이블을 기반으로 할 때, 해당 테이블의 기본 키가 유지되므로 키 보존 테이블이 됩니다.
CREATE VIEW emp_view AS
SELECT employee_id, first_name, last_name, department_id
FROM employees; employees 테이블의 기본 키(PK: employee_id)가 뷰에서도 유지됨.emp_view에서 UPDATE, INSERT, DELETE 수행 가능집UPDATE emp_view
SET last_name = 'Smith'
WHERE employee_id = 100; -- ✅ 성공 (키 보존 테이블이므로 가능) 👉 JOIN된 뷰에서는 기본 키가 유지되는 테이블만 DML 가능
CREATE VIEW emp_dept_view AS
SELECT e.employee_id, e.first_name, e.department_id, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.department_id; employees의 기본 키 employee_id는 뷰에서도 유일성을 유지departments의 department_id는 중복될 가능성이 있음employees는 키 보존 테이블이지만, departments는 키 보존 테이블이 아님.UPDATE emp_dept_view
SET first_name = 'John'
WHERE employee_id = 101; -- ✅ 성공 (키 보존 테이블인 employees에 대한 변경)
UPDATE emp_dept_view
SET department_name = 'HR'
WHERE department_id = 10; -- ❌ 오류 (departments 테이블은 키 보존되지 않음) DISTINCT, GROUP BY, AGGREGATE FUNCTIONS(SUM, COUNT, AVG 등)을 사용하지 않아야 함. CREATE VIEW emp_distinct AS
SELECT DISTINCT department_id FROM employees; DISTINCT를 사용하면 기본 키(employee_id)가 사라짐.emp_distinct 뷰에서는 UPDATE 불가능.UPDATE emp_distinct
SET department_id = 50 WHERE department_id = 10;
-- ❌ 오류: 기본 키가 보존되지 않으므로 UPDATE 불가능 CREATE VIEW emp_grouped AS
SELECT department_id, COUNT(*) AS emp_count
FROM employees
GROUP BY department_id; GROUP BY를 사용하면 기본 키(employee_id)가 유지되지 않음.emp_grouped 뷰에서는 UPDATE, INSERT, DELETE 불가능.UPDATE emp_grouped
SET emp_count = 10 WHERE department_id = 20;
-- ❌ 오류: 키 보존되지 않음 (기본 키 X) 키 보존되지 않는 테이블이 있는 뷰에서도 INSTEAD OF TRIGGER를 사용하면 DML 가능.
CREATE OR REPLACE TRIGGER emp_dept_trigger
INSTEAD OF UPDATE ON emp_dept_view
FOR EACH ROW
BEGIN
UPDATE employees
SET first_name = :NEW.first_name
WHERE employee_id = :OLD.employee_id;
END; emp_dept_view에서 employees 테이블에 대한 UPDATE 가능.| 경우 | 키 보존 여부 | DML 가능 여부 |
|---|---|---|
| 단일 테이블 뷰 (기본 키 유지) | ✅ 가능 | ✅ 가능 |
| JOIN 뷰에서 기본 키 유지 | ✅ 가능 | ✅ 가능 (해당 테이블만) |
| JOIN 뷰에서 기본 키 유지되지 않음 | ❌ 불가능 | ❌ 오류 발생 |
| DISTINCT, GROUP BY 포함 | ❌ 불가능 | ❌ 오류 발생 |
| INSTEAD OF TRIGGER 사용 | ✅ 가능 | ✅ 가능 |
💡 결론:
🚀 뷰에서 데이터를 수정하고 싶다면, 키 보존 여부를 꼭 확인해야 합니다!
유튜브에 AI 자동 생성 영상이 넘쳐납니다. 진짜 크리에이터들은 어떻게 살아남아야 할까요? AI와 경쟁하는 3가지 생존…
이틀 전에 사이드카가 걸렸을 때만 해도 "한 번 놀란 장"으로 끝날 줄 알았는데요. 15일 아침…
오전 시황 글에 이어 장중 후속 정리입니다. 코스피는 개장 직후 5%대였던 낙폭이 오전 10시 전후에…
10월 15일 목요일 아침, 코스피가 전날 종가보다 5.59% 낮은 5,673.01로 출발했습니다. 장 시작 7분 만에…
삼성 갤럭시 AI, 써보니 실망스러웠다. 온디바이스 한계, 지역 제한, 낮은 일상 활용도 등 현실적인 문제점…
주 52시간 상한이 기업 성과에 어떤 영향을 줬는지를 다룬 KDI(한국개발연구원) 연구 내용이 10월 14일 국회를…