Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL 뷰(View)에서 행을 삭제하면 기본 테이블의 데이터도 함께 삭제될까?


결론: 네, 뷰에서 행을 삭제하면 기본 테이블의 행도 함께 삭제됩니다

MySQL에서 뷰(View)는 데이터를 직접 저장하지 않고 기본 테이블(base table)을 참조하는 가상 테이블입니다. 따라서 뷰에 대해 DELETE 문을 실행하면 해당 조건에 맞는 행이 뷰뿐만 아니라 기본 테이블에서도 함께 삭제됩니다.

아래에서 새로운 테이블과 뷰를 직접 만들어 이 동작을 단계별로 확인해 보겠습니다.

1단계: 예제용 테이블 생성

먼저 테스트에 사용할 테이블을 생성합니다.

mysql> create table deleteFromBaseTableDemo
   -> (
   -> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
   -> Name varchar(20)
   -> );
Query OK, 0 rows affected (0.83 sec)

2단계: 샘플 데이터 삽입

INSERT 명령으로 몇 개의 레코드를 추가합니다.

mysql> insert into deleteFromBaseTableDemo(Name) values('John');
Query OK, 1 row affected (0.18 sec)
mysql> insert into deleteFromBaseTableDemo(Name) values('Carol');
Query OK, 1 row affected (0.15 sec)
mysql> insert into deleteFromBaseTableDemo(Name) values('Bob');
Query OK, 1 row affected (0.14 sec)
mysql> insert into deleteFromBaseTableDemo(Name) values('Sam');
Query OK, 1 row affected (0.14 sec)

3단계: 테이블 데이터 확인

SELECT 문으로 전체 레코드를 조회합니다.

mysql> select *from deleteFromBaseTableDemo;

실행 결과는 다음과 같습니다.

+----+-------+
| Id | Name  |
+----+-------+
|  1 | John  |
|  2 | Carol |
|  3 | Bob   |
|  4 | Sam   |
+----+-------+
4 rows in set (0.00 sec)

4단계: 뷰 생성 및 확인

이제 기본 테이블을 기반으로 뷰를 생성합니다.

mysql> create view delete_view as select Id,Name from deleteFromBaseTableDemo;
Query OK, 0 rows affected (0.17 sec)

생성된 뷰의 전체 레코드를 조회해 보겠습니다.

mysql> select *from delete_view;

실행 결과는 다음과 같습니다.

+----+-------+
| Id | Name  |
+----+-------+
|  1 | John  |
|  2 | Carol |
|  3 | Bob   |
|  4 | Sam   |
+----+-------+
4 rows in set (0.05 sec)

5단계: 뷰에서 행 삭제하기

이제 뷰에서 DELETE 문을 실행합니다. 앞서 설명했듯이, 뷰에서 행을 삭제하면 기본 테이블에서도 자동으로 같은 행이 삭제됩니다.

mysql> delete from delete_view where Id=4;
Query OK, 1 row affected (0.26 sec)

6단계: 뷰와 기본 테이블 결과 비교

먼저 뷰의 레코드를 다시 조회합니다.

mysql> select *from delete_view;

실행 결과:

+----+-------+
| Id | Name  |
+----+-------+
|  1 | John  |
|  2 | Carol |
|  3 | Bob   |
+----+-------+
3 rows in set (0.00 sec)

다음으로 기본 테이블의 레코드를 조회합니다.

mysql> select *from deleteFromBaseTableDemo;

실행 결과:

+----+-------+
| Id | Name  |
+----+-------+
|  1 | John  |
|  2 | Carol |
|  3 | Bob   |
+----+-------+
3 rows in set (0.00 sec)

정리

두 출력 결과를 비교해 보면, Id가 4인 행(Sam)이 뷰와 기본 테이블 양쪽 모두에서 삭제된 것을 확인할 수 있습니다. 즉, 뷰에 대한 DELETE 연산은 실제로 기본 테이블에 그대로 적용됩니다.

참고로 뷰를 통해 INSERT나 UPDATE도 가능하지만, 다음과 같은 경우에는 뷰를 통한 데이터 수정이 제한됩니다.

  • GROUP BY, DISTINCT 또는 집계 함수(SUM, COUNT 등)를 포함한 뷰
  • UNION을 사용한 뷰
  • 기본 테이블에 존재하지 않는 표현식 컬럼을 포함한 뷰

따라서 운영 환경에서는 뷰를 통한 데이터 변경 작업이 의도치 않게 원본 테이블에 영향을 줄 수 있으므로, 권한 관리와 함께 신중하게 사용하는 것이 좋습니다.