DROP FUNCTION

DROP FUNCTION elimina una función almacenada de la base de datos. Una vez eliminada, todas las consultas y procedimientos que la usen dejarán de funcionar.

Sintaxis

-- Eliminar una función
DROP FUNCTION nombre_funcion;
 
-- Eliminar si existe (evita error)
DROP FUNCTION IF EXISTS nombre_funcion;

Ejemplo básico

-- Crear una función
DELIMITER //
 
CREATE FUNCTION fn_test()
RETURNS VARCHAR(20)
DETERMINISTIC
BEGIN
    RETURN 'Hola MySQL';
END //
 
DELIMITER ;
-- Verificar
SELECT fn_test();
fn_test
Hola MySQL
-- Eliminar
DROP FUNCTION fn_test;
 
-- Intentar usarla genera error
-- SELECT fn_test();
-- Error: FUNCTION tienda_mysql.fn_test does not exist

IF EXISTS

-- Sin IF EXISTS: error si no existe
-- DROP FUNCTION fn_inexistente;
-- Error: FUNCTION tienda_mysql.fn_inexistente does not exist
 
-- Con IF EXISTS: solo warning
DROP FUNCTION IF EXISTS fn_inexistente;
-- Query OK, 0 rows affected, 1 warning

Verificar dependencias antes de eliminar

Antes de eliminar una función, verifica si está siendo usada:

-- Buscar en procedimientos que podrían usar la función
SELECT ROUTINE_NAME, ROUTINE_TYPE
FROM information_schema.ROUTINES
WHERE ROUTINE_SCHEMA = 'tienda_mysql'
AND ROUTINE_DEFINITION LIKE '%fn_precio_con_iva%';
-- Buscar en vistas
SELECT TABLE_NAME
FROM information_schema.VIEWS
WHERE TABLE_SCHEMA = 'tienda_mysql'
AND VIEW_DEFINITION LIKE '%fn_precio_con_iva%';

Permisos necesarios

Para eliminar una función necesitas:

  • Privilegio ALTER ROUTINE, o
  • Ser el DEFINER de la función

DROP FUNCTION vs DROP PROCEDURE

ComandoElimina
DROP FUNCTIONFunciones almacenadas
DROP PROCEDUREProcedimientos almacenados

No son intercambiables. Si intentas eliminar una función con DROP PROCEDURE, obtendrás un error.

Patrón para actualizar funciones

MySQL no tiene ALTER FUNCTION para cambiar el cuerpo. El patrón es eliminar y recrear:

-- 1. Guardar definición actual
SHOW CREATE FUNCTION fn_precio_con_iva\G
 
-- 2. Eliminar
DROP FUNCTION IF EXISTS fn_precio_con_iva;
 
-- 3. Recrear con cambios
DELIMITER //
 
CREATE FUNCTION fn_precio_con_iva(precio DECIMAL(10,2))
RETURNS DECIMAL(10,2)
DETERMINISTIC
BEGIN
    -- Nuevo IVA del 22%
    RETURN ROUND(precio * 1.22, 2);
END //
 
DELIMITER ;

En el siguiente artículo veremos una comparación detallada entre funciones y procedimientos.

Escrito por Eduardo Lázaro