키 보존 테이블(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 사용 | ✅ 가능 | ✅ 가능 |
💡 결론:
🚀 뷰에서 데이터를 수정하고 싶다면, 키 보존 여부를 꼭 확인해야 합니다!
윈도우 운영체제의 노트북에서는 iPhone 유선 테더링이 잘 안되는 경우가 많습니다. 보통 iPhone의 드라이버가 설치가 안되있어서인…
안녕하세요, 혹시 이런 생각해 본 적 없으신가요? "내가 투자한 회사는 누가 감시하고, 어떻게 운영될까?" 오늘은…
1. Gemini CLI란 무엇인가요? Gemini CLI는 터미널 환경에서 직접 Gemini 모델과 상호작용할 수 있도록 만들어진…
과적합은 머신러닝에서 학습용데이터를 과하게 학습하여, 실제데이터를 예측하지 못하는 현상을 말합니다. 인공지능(AI)의 학습 방법은 우리가 시험공부를…