Créer un alias de table avec MySQL VIEW et MERGE
Cet article vous apprend à créer un alias de table avec MySQL VIEW
et MERGE
.
Dans les deux cas, les modifications apportées à la table d’origine seront reflétées dans la table avec alias. De plus, les résultats des requêtes SELECT
sur la table aliasée et originale seront les mêmes.
Créer un alias de table avec MySQL VIEW
Un alias de table créé avec MySQL VIEW
permet à une table de pointer vers une table d’origine. Dans les coulisses, MySQL VIEW
crée une copie virtuelle de la table d’origine.
Par exemple, si vous avez TABLE_A
, vous pouvez utiliser VIEW
pour créer TABLE_B
. Par conséquent, les deux tables auront les mêmes données et une requête en lecture-écriture a le même effet sur les deux.
Pour montrer comment cela fonctionne, créez une base de données dans MySQL et utilisez le SQL suivant pour créer une table :
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;
Ensuite, utilisez MySQL VIEW
pour créer la table dba_table
:
CREATE VIEW dba_table AS SELECT * FROM database_administrators;
À partir de ce moment, les enregistrements insérés dans database_administrators
seront reflétés dans dba_table
.
Insérer des enregistrements dans la table d’origine
Utilisez ce qui suit pour insérer des enregistrements dans 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');
Confirmez que les enregistrements existent dans database_administrators
:
SELECT * FROM database_administrators;
Production:
+--------+----------------+---------------+----------------+
| 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)
Lorsque vous cochez dba_table
, vous obtenez les mêmes résultats :
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)
Insérer des enregistrements dans la table virtuelle
Vous pouvez également insérer des enregistrements dans dba_table
, et vous les verrez dans database_administrators
:
INSERT INTO dba_table (dba_first_name, dba_last_name, dba_experience) VALUES('Calvert', 'Lewin', '9 years');
Vérifiez dba_table
pour les nouvelles données :
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)
Confirmez si les nouvelles données existent dans 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)
Mettre à jour la table virtuelle
Les mises à jour dans dba_table
seront également reflétées dans database_administrators
:
UPDATE dba_table SET dba_experience = '4 years' WHERE dba_id = 2;
Voici la table mise à jour dans dba_table
et 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)
Supprimer les données de la table d’origine
Lorsque vous supprimez des données dans database_administrators
, elles sont supprimées dans dba_table
:
DELETE FROM database_administrators WHERE dba_id = 1;
Résultat de la suppression sur 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)
Comme vous pouvez le constater, les données supprimées n’existent plus dans 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)
Créer un alias de table avec le moteur de table MySQL MERGE
Avec le moteur de table MySQL MERGE
, vous pouvez créer un alias à partir d’une table originale. En attendant, pour que cela fonctionne, la table d’origine doit avoir le moteur MyISAM.
Cependant, contrairement à l’alias créé avec VIEW
, l’alias avec MERGE
est en lecture seule. Cela signifie que vous ne pouvez pas insérer de données dans la table avec alias.
Pour montrer comment cela fonctionne, créez une base de données et utilisez ce qui suit pour créer une table :
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;
Maintenant, exécutez les SQL suivants l’un après l’autre :
CREATE TABLE mergecopy_devops_engineer SELECT * FROM devops_engineer;
ALTER TABLE mergecopy_devops_engineer ENGINE=MERGE;
ALTER TABLE mergecopy_devops_engineer UNION=(devops_engineer);
Avec le SQL précédent, mergecopy_devops_engineer
devient une copie en lecture seule de devops_engineer
. Maintenant, insérez des enregistrements dans 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');
Voici les nouveaux enregistrements dans 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)
Lorsque vous cochez mergecopy_devops_engineer
, les enregistrements sont les mêmes :
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)
Pendant ce temps, vous pouvez supprimer et mettre à jour des données dans mergecopy_devops_engineer
. En conséquence, vous verrez les changements dans devops_engineer
.
Cependant, vous ne pouvez pas insérer de données dans mergecopy_devops_engineer
car il est en lecture seule :
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