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;

Gracias por proporcionar la estructura de la tabla audiencia. Ya 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).

sql
-- Crear la tabla 'delitos' con una clave foránea que referencia la tabla 'audiencia' CREATE TABLE delitos ( id_delito INT AUTO_INCREMENT PRIMARY KEY, id_audiencia INT NOT NULL, nombre_delito VARCHAR(255) NOT NULL, FOREIGN KEY (id_audiencia) REFERENCES audiencia(id_audiencia) ON DELETE CASCADE );

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.

sql
-- 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:

sql

SELECT * FROM delitos;

3. Eliminar la columna delito de la tabla audiencia

Después de mover los datos a la nueva tabla, puedes eliminar la columna delito de la tabla audiencia, ya que ahora los delitos están en la tabla delitos.

-- Eliminar la columna 'delito' de la tabla 'audiencia'

ALTER TABLE audiencia DROP COLUMN delito;


4. Resumen

  1. Crear la tabla delitos para almacenar los delitos.
  2. Extraer y mover los delitos de la columna delito en audiencia a la tabla delitos.
  3. Eliminar la columna delito de la tabla audiencia una vez que la migración haya sido exitosa.

Este proceso permitirá normalizar la tabla, eliminando la redundancia de almacenar múltiples delitos en una sola columna y estableciendo una relación adecuada de uno a muchos.



Tu consulta tiene algunos errores y confusiones menores. Para dividir los nombres de los delitos que están separados por comas en la columna delito de la tabla audiencia y luego insertarlos en la tabla audiencia_delitos, puedes usar una combinación de funciones de MySQL. Aquí está la consulta corregida:

  1. Corregir el alias de la columna: Cambié a.audiencia_delitos por a.delito, ya que los nombres de los delitos están en la columna delito de la tabla audiencia.

  2. Modificar el WHERE: El filtro en el WHERE se ajustó para tomar en cuenta correctamente el número de comas en la columna delito.

Aquí tienes la consulta corregida:


INSERT INTO audiencia_delitos (id_audiencia, delito)

SELECT 

    a.id_audiencia, 

    TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(a.delito, ',', n.n), ',', -1)) AS 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

ON CHAR_LENGTH(a.delito) - CHAR_LENGTH(REPLACE(a.delito, ',', '')) >= n.n - 1

WHERE a.delito IS NOT NULL;


Comentarios

Entradas populares de este blog

Normalizar valores

NORMALIZAR TABLA-audiencia_intervinientes

Listar audiencias