Crear alias de tabla con MySQL VIEW y MERGE

Habdul Hazeez 18 agosto 2022
  1. Crear alias de tabla con MySQL VIEW
  2. Crear alias de tabla con MySQL MERGE Table Engine
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 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

Artículo relacionado - MySQL Table