20-04-2026

Crud con motor merge en mariadb y mysql (mrg_myisam)

El motor merge es un motor de almacenamiento especial de MySQL y MariaDB. Se suele usar para manejar tablas muy grandes dividiéndolas en partes más pequeñas y manejables
  • Crear las tablas base
    -- Tabla de pedidos del año 2024
    CREATE TABLE pedidos_2024 (
    id INT NOT NULL AUTO_INCREMENT,
    cliente VARCHAR(100) NOT NULL,
    monto  DECIMAL(10,2) NOT NULL,
    fecha  DATE NOT NULL,
    PRIMARY KEY (id),
    INDEX idx_fecha (fecha)
    ) ENGINE=MyISAM;
    
    -- Tabla de pedidos del año 2025
    CREATE TABLE pedidos_2025 (
    id INT NOT NULL AUTO_INCREMENT,
    cliente VARCHAR(100) NOT NULL,
    monto  DECIMAL(10,2) NOT NULL,
    fecha  DATE NOT NULL,
    PRIMARY KEY (id),
    INDEX idx_fecha (fecha)
    ) ENGINE=MyISAM;
    
  • Crear la tabla MERGE (MRG_MYISAM)
    CREATE TABLE pedidos_total (
    id INT NOT NULL AUTO_INCREMENT,
    cliente VARCHAR(100) NOT NULL,
    monto  DECIMAL(10,2) NOT NULL,
    fecha  DATE NOT NULL,
    PRIMARY KEY (id),
    INDEX idx_fecha (fecha)
    ) ENGINE=MRG_MYISAM
    UNION=(pedidos_2024, pedidos_2025)
    INSERT_METHOD=LAST;-- Los INSERT van siempre a la última tabla
    
  • CRUD completo sobre la tabla MERGE "pedidos_total"
    1. C = CREATE (INSERT)
      -- Insertar un pedido nuevo (se guardará en pedidos_2025 porque INSERT_METHOD=LAST)
      INSERT INTO pedidos_total (cliente, monto, fecha) 
      VALUES ('Juan Pérez', 1250.75, '2025-04-10');
      
      -- Insertar varios registros
      INSERT INTO pedidos_total (cliente, monto, fecha) VALUES 
      ('Ana López', 850.00, '2025-04-12'),
      ('Carlos Ruiz', 2340.50, '2024-11-05');
      
    2. R = READ (SELECT)
      -- Ver todos los pedidos (de 2024 y 2025 juntos)
      SELECT * FROM pedidos_total;
      
      -- Ver solo pedidos del 2025
      SELECT * FROM pedidos_total WHERE fecha >= '2025-01-01';
      
      -- Pedidos ordenados por monto descendente
      SELECT id, cliente, monto, fecha 
      FROM pedidos_total 
      ORDER BY monto DESC;
      
      -- Total de ventas
      SELECT SUM(monto) AS total_ventas, COUNT(*) AS cantidad_pedidos 
      FROM pedidos_total;
      
    3. U = UPDATE
      -- Actualizar el monto de un pedido específico
      UPDATE pedidos_total 
      SET monto = 1500.00 
      WHERE id = 5;
      
      -- Actualizar el cliente y fecha de varios registros
      UPDATE pedidos_total 
      SET cliente = 'Ana López García', fecha = '2025-04-15'
      WHERE cliente = 'Ana López';
      
    4. D = DELETE
      -- Borrar un pedido específico
      DELETE FROM pedidos_total WHERE id = 3;
      
      -- Borrar todos los pedidos de antes de 2025 (solo afectará a la tabla 2024)
      DELETE FROM pedidos_total WHERE fecha < '2025-01-01';
      

Notas importantes sobre CRUD en tablas MERGE

  • INSERT: Siempre va a la tabla indicada en INSERT_METHOD (FIRST o LAST). Si pones NO, no se podrá insertar.
  • UPDATE y DELETE: Funcionan normalmente y afectan a la tabla real donde está el registro.
  • SELECT: Muestra los datos de todas las tablas unidas como si fuera una sola.
  • No se pueden usar FOREIGN KEYS ni transacciones, porque es MyISAM.
  • Si se borra la tabla MERGE (DROP TABLE pedidos_total), solo se borra la definición, no los datos de las tablas base.