En esta entrada veremos como insertar datos de una tabla a otra, a modo histórico, de forma automática.
En primer lugar, crearemos 2 tablas de ejemplo. La primera (orders) donde añadiremos los registros por defecto. La segunda (orders_history) se rellenará automaticamente cuando se añada un registro en la primera (orders):
CREATE TABLE orders (
order_id INT AUTO_INCREMENT PRIMARY KEY,
customer_name VARCHAR(255),
order_date DATE,
total_amount DECIMAL(10, 2)
);
CREATE TABLE orders_history (
history_id INT AUTO_INCREMENT PRIMARY KEY,
order_id INT,
customer_name VARCHAR(255),
order_date DATE,
total_amount DECIMAL(10, 2),
timestamp TIMESTAMP
);
Ahora crearemos el trigger. Básicamente lo que realiza es la ejecución de un INSERT al detectar una fila nueva en la tabla original (orders)
DELIMITER $$
CREATE TRIGGER after_order_insert
AFTER INSERT ON orders
FOR EACH ROW
BEGIN
INSERT INTO orders_history (order_id, customer_name, order_date, total_amount, timestamp) VALUES (NEW.order_id, NEW.customer_name, NEW.order_date, NEW.total_amount, NOW());
END $$
DELIMITER;
Probamos y validamos que efectivamente aún no tenemos datos en ninguna tabla:
MariaDB [orders]> SELECT * from orders;
Empty set (0.001 sec)
MariaDB [orders]> SELECT * from orders_history;
Empty set (0.006 sec)
Ahora, realizaremos 2 entradas de datos en la tabla maestra (orders):
INSERT INTO orders (customer_name, order_date, total_amount) VALUES ('John Doe', '2014-01-04', '100.00');
INSERT INTO orders (customer_name, order_date, total_amount) VALUES ('John Doe', '2024-01-04', '80.00');
Verificamos que efectivamente los datos se han introducido en la tabla (orders)
MariaDB [orders]> SELECT * from orders;
+----------+---------------+------------+--------------+
| order_id | customer_name | order_date | total_amount |
+----------+---------------+------------+--------------+
| 1 | John Doe | 2014-01-04 | 100.00 |
| 2 | John Doe | 2024-01-04 | 80.00 |
+----------+---------------+------------+--------------+
2 rows in set (0.005 sec)
Y ahora, al verificar la tabla adicional (orders_history), veremos que también se han introducido los datos:
MariaDB [orders]> SELECT * from orders_history;
+------------+----------+---------------+------------+--------------+---------------------+
| history_id | order_id | customer_name | order_date | total_amount | timestamp |
+------------+----------+---------------+------------+--------------+---------------------+
| 1 | 1 | John Doe | 2014-01-04 | 100.00 | 2024-07-23 10:22:20 |
| 2 | 2 | John Doe | 2024-01-04 | 80.00 | 2024-07-23 10:22:36 |
+------------+----------+---------------+------------+--------------+---------------------+
2 rows in set (0.004 sec)