MySQL VIEW 및 MERGE를 사용하여 테이블 별칭 생성
이 기사에서는 MySQL VIEW
및 MERGE
를 사용하여 테이블 별칭을 만드는 방법을 설명합니다.
두 경우 모두 원래 테이블의 변경 사항이 별칭이 지정된 테이블에 반영됩니다. 또한 별칭이 지정된 테이블과 원본 테이블에 대한 SELECT
쿼리의 결과는 동일합니다.
MySQL VIEW
로 테이블 별칭 생성
MySQL VIEW
로 생성된 테이블 별칭을 사용하면 한 테이블이 원래 테이블을 가리킬 수 있습니다. 무대 뒤에서 MySQL VIEW
는 원본 테이블의 가상 복사본을 생성합니다.
예를 들어, TABLE_A
가 있는 경우 VIEW
를 사용하여 TABLE_B
를 만들 수 있습니다. 결과적으로 두 테이블 모두 동일한 데이터를 가지며 읽기-쓰기 쿼리는 둘 모두에 동일한 영향을 미칩니다.
이것이 어떻게 작동하는지 보여주기 위해 MySQL에서 데이터베이스를 생성하고 다음 SQL을 사용하여 테이블을 생성합니다:
CREATE TABLE database_administrators (
dba_id INT NOT NULL AUTO_INCREMENT,
dba_first_name VARCHAR(50) NOT NULL,
dba_last_name VARCHAR(50) NOT NULL,
dba_experience VARCHAR(10) NOT NULL,
PRIMARY KEY (dba_id)
) ENGINE = InnoDB;
다음으로 MySQL VIEW
를 사용하여 dba_table
테이블을 생성합니다.
CREATE VIEW dba_table AS SELECT * FROM database_administrators;
이 시점부터 database_administrators
에 삽입된 레코드는 dba_table
에 반영됩니다.
원본 테이블에 레코드 삽입
다음을 사용하여 database_administrators
에 레코드를 삽입합니다.
INSERT INTO database_administrators (dba_first_name, dba_last_name, dba_experience) VALUES('Michael', 'Faraday', '3 years');
INSERT INTO database_administrators (dba_first_name, dba_last_name, dba_experience) VALUES('Joseph', 'Klinsman', '2 years');
INSERT INTO database_administrators (dba_first_name, dba_last_name, dba_experience) VALUES('Matt', 'Abott', '2 years');
database_administrators
에 레코드가 있는지 확인합니다.
SELECT * FROM database_administrators;
출력:
+--------+----------------+---------------+----------------+
| dba_id | dba_first_name | dba_last_name | dba_experience |
+--------+----------------+---------------+----------------+
| 1 | Michael | Faraday | 3 years |
| 2 | Joseph | Klinsman | 2 years |
| 3 | Matt | Abott | 2 years |
+--------+----------------+---------------+----------------+
3 rows in set (0.00 sec)
dba_table
을 확인하면 동일한 결과를 얻을 수 있습니다.
mysql > SELECT * FROM dba_table;
+--------+----------------+---------------+----------------+
| dba_id | dba_first_name | dba_last_name | dba_experience |
+--------+----------------+---------------+----------------+
| 1 | Michael | Faraday | 3 years |
| 2 | Joseph | Klinsman | 2 years |
| 3 | Matt | Abott | 2 years |
+--------+----------------+---------------+----------------+
3 rows in set (0.00 sec)
가상 테이블에 레코드 삽입
dba_table
에 레코드를 삽입할 수도 있으며 database_administrators
에서 볼 수 있습니다.
INSERT INTO dba_table (dba_first_name, dba_last_name, dba_experience) VALUES('Calvert', 'Lewin', '9 years');
새 데이터에 대한 dba_table
을 확인하십시오.
mysql > SELECT * FROM dba_table;
+--------+----------------+---------------+----------------+
| dba_id | dba_first_name | dba_last_name | dba_experience |
+--------+----------------+---------------+----------------+
| 1 | Michael | Faraday | 3 years |
| 2 | Joseph | Klinsman | 2 years |
| 3 | Matt | Abott | 2 years |
| 4 | Calvert | Lewin | 9 years |
+--------+----------------+---------------+----------------+
4 rows in set (0.00 sec)
database_administrators
에 새 데이터가 있는지 확인합니다.
mysql > SELECT * FROM database_administrators;
+--------+----------------+---------------+----------------+
| dba_id | dba_first_name | dba_last_name | dba_experience |
+--------+----------------+---------------+----------------+
| 1 | Michael | Faraday | 3 years |
| 2 | Joseph | Klinsman | 2 years |
| 3 | Matt | Abott | 2 years |
| 4 | Calvert | Lewin | 9 years |
+--------+----------------+---------------+----------------+
4 rows in set (0.00 sec)
가상 테이블 업데이트
dba_table
의 업데이트는 database_administrators
에도 반영됩니다.
UPDATE dba_table SET dba_experience = '4 years' WHERE dba_id = 2;
다음은 dba_table
및 database_administrators
에서 업데이트된 테이블입니다.
+--------+----------------+---------------+----------------+
| dba_id | dba_first_name | dba_last_name | dba_experience |
+--------+----------------+---------------+----------------+
| 1 | Michael | Faraday | 3 years |
| 2 | Joseph | Klinsman | 2 years |
| 3 | Matt | Abott | 2 years |
| 4 | Calvert | Lewin | 9 years |
+--------+----------------+---------------+----------------+
4 rows in set (0.00 sec)
원본 테이블에서 데이터 삭제
database_administrators
에서 데이터를 삭제하면 dba_table
에서 삭제됩니다.
DELETE FROM database_administrators WHERE dba_id = 1;
database_administrators
삭제 결과:
mysql> SELECT * from database_administrators;
+--------+----------------+---------------+----------------+
| dba_id | dba_first_name | dba_last_name | dba_experience |
+--------+----------------+---------------+----------------+
| 2 | Joseph | Klinsman | 4 years |
| 3 | Matt | Abott | 2 years |
| 4 | Calvert | Lewin | 9 years |
+--------+----------------+---------------+----------------+
3 rows in set (0.00 sec)
보시다시피 삭제된 데이터는 dba_table
에 더 이상 존재하지 않습니다.
mysql> SELECT * from dba_table;
+--------+----------------+---------------+----------------+
| dba_id | dba_first_name | dba_last_name | dba_experience |
+--------+----------------+---------------+----------------+
| 2 | Joseph | Klinsman | 4 years |
| 3 | Matt | Abott | 2 years |
| 4 | Calvert | Lewin | 9 years |
+--------+----------------+---------------+----------------+
3 rows in set (0.00 sec)
MySQL MERGE
테이블 엔진으로 테이블 별칭 생성
MySQL MERGE
테이블 엔진을 사용하면 원본 테이블에서 별칭을 만들 수 있습니다. 한편, 이것이 작동하려면 원본 테이블에 MyISAM 엔진이 있어야 합니다.
그러나 VIEW
로 생성된 별칭과 달리 MERGE
가 있는 별칭은 읽기 전용입니다. 이는 별칭이 지정된 테이블에 데이터를 삽입할 수 없음을 의미합니다.
작동 방식을 보려면 데이터베이스를 만들고 다음을 사용하여 테이블을 만듭니다.
CREATE TABLE devops_engineer (
engineer_id INT NOT NULL AUTO_INCREMENT,
engineer_first_name VARCHAR(50) NOT NULL,
engineer_last_name VARCHAR(50) NOT NULL,
PRIMARY KEY (engineer_id)
) ENGINE = MyISAM;
이제 다음 SQL을 차례로 실행합니다.
CREATE TABLE mergecopy_devops_engineer SELECT * FROM devops_engineer;
ALTER TABLE mergecopy_devops_engineer ENGINE=MERGE;
ALTER TABLE mergecopy_devops_engineer UNION=(devops_engineer);
이전 SQL에서는 mergecopy_devops_engineer
가 devops_engineer
의 읽기 전용 복사본이 됩니다. 이제 devops_engineer
에 레코드를 삽입합니다.
INSERT INTO devops_engineer (engineer_first_name, engineer_last_name) VALUES('Delft', 'Stack');
INSERT INTO devops_engineer (engineer_first_name, engineer_last_name) VALUES('Margaret', 'Thatcher');
다음은 devops_engineer
의 새 레코드입니다.
mysql> SELECT * FROM devops_engineer;
+-------------+---------------------+--------------------+
| engineer_id | engineer_first_name | engineer_last_name |
+-------------+---------------------+--------------------+
| 1 | Delft | Stack |
| 2 | Margaret | Thatcher |
+-------------+---------------------+--------------------+
2 rows in set (0.03 sec)
mergecopy_devops_engineer
를 확인하면 레코드가 동일합니다.
mysql> SELECT * FROM mergecopy_devops_engineer;
+-------------+---------------------+--------------------+
| engineer_id | engineer_first_name | engineer_last_name |
+-------------+---------------------+--------------------+
| 1 | Delft | Stack |
| 2 | Margaret | Thatcher |
+-------------+---------------------+--------------------+
2 rows in set (0.03 sec)
한편 mergecopy_devops_engineer
에서 데이터를 삭제하고 업데이트할 수 있습니다. 결과적으로 devops_engineer
에 변경 사항이 표시됩니다.
그러나 읽기 전용이기 때문에 mergecopy_devops_engineer
에 데이터를 삽입할 수 없습니다.
mysql> INSERT INTO mergecopy_devops_engineer (engineer_first_name, engineer_last_name) VALUES('John', 'Doe');
ERROR 1036 (HY000): Table 'mergecopy_devops_engineer' is read only
Habdul Hazeez is a technical writer with amazing research skills. He can connect the dots, and make sense of data that are scattered across different media.
LinkedIn