NORMALIZAR TABLA-DELITOS
Para normalizar tu base de datos y mover los delitos de la tabla audiencias a una tabla aparte llamada delitos, necesitas hacer lo siguiente:
CREATE TABLE audiencia (
id_audiencia int(11) NOT NULL,
nombre varchar(13) NOT NULL,
distrito varchar(20) DEFAULT NULL,
sala varchar(18) DEFAULT NULL,
fecha_c date DEFAULT NULL,
fecha_ctime datetime DEFAULT NULL,
hora varchar(6) DEFAULT NULL,
juez varchar(65) DEFAULT NULL,
tipoaudiencia varchar(200) DEFAULT NULL,
confidencialidad varchar(8) DEFAULT NULL,
delito varchar(300) DEFAULT NULL,
asistente varchar(25)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
a que la columna delito contiene múltiples delitos en algunos casos y deseas normalizar los datos, moveremos los delitos a una nueva tabla llamada delitos. Aquí te explico cómo hacerlo paso a paso, manteniendo la integridad de tus datos.
1. Crear la nueva tabla delitos
Vamos a crear una tabla delitos con una relación de uno a muchos (una audiencia puede tener varios delitos).
-- Crear la tabla 'delitos' con una clave foránea que referencia la tabla 'audiencia'
CREATE TABLE `audiencia_delitos` ( `id` int(11) NOT NULL AUTO_INCREMENT, `id_audiencia` int(11) NOT NULL, `delito` varchar(300) NOT NULL, PRIMARY KEY (`id`), FOREIGN KEY (`id_audiencia`) REFERENCES `audiencia`(`id_audiencia`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
2. Insertar los delitos antiguos en la nueva tabla
Si los delitos en la columna delito están separados por comas, necesitamos extraerlos y moverlos a la tabla delitos. A continuación, te muestro cómo puedes hacerlo en MySQL:
a) Insertar los delitos en la nueva tabla delitos
Suponiendo que en la columna delito los nombres de los delitos están separados por comas, podemos usar una combinación de funciones para dividir los delitos y luego insertarlos en la nueva tabla.
-- Insertar los delitos separados por comas en la nueva tabla 'delitos'
INSERT INTO delitos (id_audiencia, nombre_delito)
SELECT
id_audiencia,
TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(a.delito, ',', n.n), ',', -1)) AS nombre_delito
FROM
audiencia a
JOIN
(SELECT 1 n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) n
WHERE
CHAR_LENGTH(a.delito) - CHAR_LENGTH(REPLACE(a.delito, ',', '')) >= n.n - 1;
Explicación:
TRIM(SUBSTRING_INDEX(...)): Esto separa cada delito individual en la cadena delimitada por comas.JOIN (SELECT 1 UNION ALL SELECT 2...): Genera una secuencia de números para separar los delitos. Puedes ajustar esta secuencia dependiendo del número máximo de delitos que esperas por audiencia.CHAR_LENGTH(a.delito) - CHAR_LENGTH(REPLACE(a.delito, ',', '')): Cuenta las comas en la cadena, lo que ayuda a identificar cuántos delitos hay.
b) Verificar los datos insertados
Una vez ejecutada la consulta, asegúrate de verificar que los datos en la tabla delitos sean correctos:
SELECT * FROM delitos;
Comentarios
Publicar un comentario