MySQLVIEW および MERGE を使用してテーブルエイリアスを作成する

Habdul Hazeez 2023年1月30日
  1. MySQL でテーブルエイリアスを作成 VIEW
  2. MySQL MERGE テーブルエンジンを使用してテーブルエイリアスを作成する
MySQLVIEW および MERGE を使用してテーブルエイリアスを作成する

この記事では、MySQL の VIEWMERGE を使用してテーブルエイリアスを作成する方法について説明します。

どちらの場合も、元のテーブルでの変更はエイリアステーブルに反映されます。また、エイリアステーブルと元のテーブルに対する SELECT クエリの結果は同じになります。

MySQL でテーブルエイリアスを作成 VIEW

MySQL VIEW で作成されたテーブルエイリアスにより、1つのテーブルが元のテーブルを指すことができます。裏側では、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_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
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