Ejecutar trigger al insertar datos en una tabla

    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)
    

    Leave a Reply

    Your email address will not be published. Required fields are marked *