MySQLVIEW および MERGE を使用してテーブルエイリアスを作成する
この記事では、MySQL の VIEW
と MERGE
を使用してテーブルエイリアスを作成する方法について説明します。
どちらの場合も、元のテーブルでの変更はエイリアステーブルに反映されます。また、エイリアステーブルと元のテーブルに対する 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_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