MySQL VIEW 및 MERGE를 사용하여 테이블 별칭 생성

Habdul Hazeez 2023년1월30일
  1. MySQL VIEW로 테이블 별칭 생성
  2. MySQL MERGE 테이블 엔진으로 테이블 별칭 생성
MySQL VIEW 및 MERGE를 사용하여 테이블 별칭 생성

이 기사에서는 MySQL VIEWMERGE를 사용하여 테이블 별칭을 만드는 방법을 설명합니다.

두 경우 모두 원래 테이블의 변경 사항이 별칭이 지정된 테이블에 반영됩니다. 또한 별칭이 지정된 테이블과 원본 테이블에 대한 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_tabledatabase_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_engineerdevops_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 avatar Habdul Hazeez avatar

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

관련 문장 - MySQL Table