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

Habdul Hazeez 2023年1月30日 MySQL MySQL Table
  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 
チュートリアルを楽しんでいますか? <a href="https://www.youtube.com/@delftstack/?sub_confirmation=1" style="color: #a94442; font-weight: bold; text-decoration: underline;">DelftStackをチャンネル登録</a> して、高品質な動画ガイドをさらに制作するためのサポートをお願いします。 Subscribe
著者: 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