Crear alias de tabla con MySQL VIEW y MERGE
Este artículo le enseña cómo crear un alias de tabla usando MySQL VIEW
y MERGE
.
En ambos casos, los cambios en la tabla original se reflejarán en la tabla con alias. Además, los resultados de las consultas SELECT
en la tabla con alias y original serán los mismos.
Crear alias de tabla con MySQL VIEW
Un alias de tabla creado con MySQL VIEW
permite que una tabla apunte a una tabla original. Detrás de escena, MySQL VIEW
crea una copia virtual de la tabla original.
Por ejemplo, si tiene TABLE_A
, puede usar VIEW
para crear TABLE_B
. Como resultado, ambas tablas tendrán los mismos datos y una consulta de lectura y escritura tiene el mismo efecto en ambas.
Para mostrar cómo funciona esto, cree una base de datos en MySQL y use el siguiente SQL para crear una tabla:
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;
Luego, use MySQL VIEW
para crear la tabla dba_table
:
CREATE VIEW dba_table AS SELECT * FROM database_administrators;
A partir de este momento, los registros insertados en database_administrators
se reflejarán en dba_table
.
Insertar registros en la tabla original
Use lo siguiente para insertar registros en 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');
Confirme que los registros existen en database_administrators
:
SELECT * FROM database_administrators;
Producción :
+--------+----------------+---------------+----------------+
| 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)
Cuando marque dba_table
, obtendrá los mismos resultados:
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)
Insertar registros en la tabla virtual
También puedes insertar registros en dba_table
, y los verás en database_administrators
:
INSERT INTO dba_table (dba_first_name, dba_last_name, dba_experience) VALUES('Calvert', 'Lewin', '9 years');
Compruebe dba_table
para los nuevos datos:
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)
Confirme si los nuevos datos existen en 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)
Actualizar la Mesa Virtual
Las actualizaciones en dba_table
también se reflejarán en database_administrators
:
UPDATE dba_table SET dba_experience = '4 years' WHERE dba_id = 2;
La siguiente es la tabla actualizada en dba_table
y 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)
Eliminar datos de la tabla original
Cuando elimina datos en database_administrators
, se elimina en dba_table
:
DELETE FROM database_administrators WHERE dba_id = 1;
Resultado de la eliminación en 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)
Como puede ver, los datos eliminados ya no existen en 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)
Crear alias de tabla con MySQL MERGE
Table Engine
Con el motor de tablas MERGE
de MySQL, puede crear un alias a partir de una tabla original. Mientras tanto, para que esto funcione, la tabla original debe tener el motor MyISAM.
Sin embargo, a diferencia del alias creado con VIEW
, el alias con MERGE
es de solo lectura. Esto significa que no puede insertar ningún dato en la tabla con alias.
Para mostrar cómo funciona esto, cree una base de datos y use lo siguiente para crear una tabla:
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;
Ahora, ejecute el siguiente SQL uno tras otro:
CREATE TABLE mergecopy_devops_engineer SELECT * FROM devops_engineer;
ALTER TABLE mergecopy_devops_engineer ENGINE=MERGE;
ALTER TABLE mergecopy_devops_engineer UNION=(devops_engineer);
Con el SQL anterior, mergecopy_devops_engineer
se convierte en una copia de solo lectura de devops_engineer
. Ahora, inserte registros en 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');
Los siguientes son los nuevos registros en 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)
Cuando marca mergecopy_devops_engineer
, los registros son los mismos:
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)
Mientras tanto, puede eliminar y actualizar datos en mergecopy_devops_engineer
. Como resultado, verá los cambios en devops_engineer
.
Sin embargo, no puede insertar datos en mergecopy_devops_engineer
porque es de solo lectura:
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