MySQL - Insercion erronea de filas

 
Vista:
sin imagen de perfil

Insercion erronea de filas

Publicado por Daniel (8 intervenciones) el 11/08/2017 09:38:49
Saludos!

Tengo una app para gestionar una base de datos que realmente funciona correctamente, pero cuando realizo insercion de datos en cualquier tabla me genera 4 registros iguales. He probado a poner una pk para utilizar replace o insert ignore, pero como ya tengo registros duplicados, no es posible, ademas de que cuando elimino los registros duplicados y la pongo, me da un error desconocido.

Hace no mucho modifique un archivo llamado telipad.php en el que incluia otros dos con "include" y desde entonces me esta pasando esto. No se si esta puede ser la causa, pero los archivos funcionan y todo funciona correctamente, es solo que al insertar o modificar registros atraves de la app web, se insertan 4 iguales.

Si se necesita que pegue el codigo aqui puedo hacerlo.

Alguien se le ocurre porque puede ser? Estoy totalmente bloqueado y no se donde esta el fallo.

Un saludo!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Insercion erronea de filas

Publicado por leonardo_josue (414 intervenciones) el 11/08/2017 16:14:47
Hola Daniel:

Este comportamiento pareciera ser más un problema con PHP que con la BD's en si... sin embargo, no es correcto que incluyas código de programación en este foro, ya que aquí solo tratamos de MySQL y hay muchos foristas (me incluyo entre ellos) que no sabemos de PHP. Puedes utilizar el foro de PHP para publicar tu código y ver si alguno de los expertos puede ayudarte:

http://www.lawebdelprogramador.com/foros/PHP/index1.html

Ahora bien, aquí hay varias recomendaciones...

1. la idea de poner PK o UNIQUE constrainst es buena, pero tal como lo comentas, primero debes eliminar los registros duplicados de tu tabla... Dices que al tratar de hacerlo te da un error desconocido O_o, y eso no es de mucha ayuda, ya que la adivinación no es uno de nuestros talentos. Postea la estructura de tu tabla, pon datos de ejemplo y dinos exactamente qué es lo que estás intentando hacer para tratar de eliminar los registros duplicados y cuál es el error que estás obteniendo. Hay muchas técnicas o formas de eliminar registros duplicados, y dependerá de cómo está tu información poder decirte cuál es la mejor opción.

2. Revisa que los registros estén efectivamente duplicados, es decir, que TODOS LOS CAMPOS TENGAN EL MISMO VALOR. si uno solo de ellos tuviera un valor distinto, entonces NO PUEDES HABLAR DE QUE ESTÉN DUPLICADOS.

3. Si comentas que a partir de los cambios que hiciste en tu página telipad.php comenzaron los problemas, pues es muy probable que eso sea justamente la causa. Si tienes una copia de respaldo, vuelve a poner tu página como estaba antes de los cambios y haz la prueba. Si el problema queda resuelto, entonces puedes preguntarle a los expertos de PHP qué problema hay con el código que quieres agregar y/o modificar.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Insercion erronea de filas

Publicado por Daniel (8 intervenciones) el 16/08/2017 09:49:30
Buenos dias!

Primero de todo, muchas gracias por contestar. Agradezco la respuesta aunque solo haya tenido una, porque la verdad que necesito ayuda con esto, sigo bloqueado. Considerare el postear mi problema en el foro de PHP.

Contesto a tus recomendaciones:

1.- En mis tablas no hay ninguna PK porque no quise desde el principio, y ahora me encuentro con ese problema del que hablaba en el primer post. Al eliminar los registros duplicados e intentar poner la PK, es como si el codigo tuviera algun tipo de error y fallase. El error que da es "mysql_error() expects parameter 1 to be resource, object given". He intentado buscar el error en internet y nada, sigo igual de bloqueado. Asi que supongo que para mi no es una opcion el incluir la PK Ya casi en respuesta a la recomendacion numero 3, estoy de acuerdo en que el problema tiene pinta de venir del PHP mas que de mysql, pero no tengo ni idea de cual es, asi que supongo que tendre que postear mi duda en el foro de PHP. Tal y como esta el codigo ahora, funciona todo correctamente, pero no puedo dejar que cada vez que se realiza una modificacion o se inserta un registro nuevo, se duplique 4 veces. El arreglo que tengo por ahora es hacer que las consultas incluyan un "distinct" pero esto tiene que ser temporal, porque si se cuatriplican los datos cada vez, consumiria cada vez mas recursos y se haria muy lenta.

2.- Los datos cuatriplicados son exactamente iguales. No hay ningun "auto_increment" ni nada, son registros absolutamente iguales.


En la recomendacion numero 1, me pedias que explicase de alguna manera mejor la estructura de la tabla y el problema. Alla va jeje. La aplicacion que he estado desarrollando es una app para manejar una base de datos de varios clientes que llevan una especie de "visitadores medicos". Estos "visitadores medicos" llevan una serie de material que es el que quieren controlar mediante esta app. Claro, este material esta asociado a muchos datos: nombres, emails, numeros de telefonos, pins, puks, imeis... en fin (si, son telefonos moviles y tablets). Estos "visitadores medicos" van cambiando y rotando y claro, el material tambien, con lo que al hacer cualquier modificacion o insercion tal y como esta el codigo ahora mismo, la app funciona, pero cuatriplica los registros en la base de datos y no tengo ni idea de porque.

En fin, si hay alguna ocurrencia o sugerencia mas... me encantaria leerla porque de verdad que sigo muy perdido.

Un saludo, y gracias de antemano.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Insercion erronea de filas

Publicado por leonardo_josue (414 intervenciones) el 16/08/2017 15:52:33
Hola de nuevo Daniel...

En el punto 1 sigues sin decirnos qué es lo que estás haciendo para tratar de eliminar los registros duplicados... además, el error que comentas pareciera que sigue siendo de PHP. En lo particular, cuando tienes que hacer operaciones con la BD's es conveniente que las hagas directamente en una consola de MySQL, o al menos con algun IDE como puede ser WORKBENCH. Trata de aislar el problema, en lugar de complicarlo más.

Hay muchas formas de eliminar registros duplicados de una tabla, es por eso que te preguntaba qué es lo que estás haciendo, y en cuanto al error, por eso es mejor hacerlo directamente en una consola de MySQL, ya que ahí los mensajes son más explícitos... voy a poner un ejemplo de cómo podrías hacerlo. Imagina que tienes una tabla así:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> SELECT * FROM tabla;
+--------+--------+
| campo1 | campo2 |
+--------+--------+
|      1 | uno    |
|      1 | uno    |
|      1 | uno    |
|      2 | dos    |
|      3 | tres   |
|      3 | tres   |
+--------+--------+
6 rows in set (0.00 sec)

Aquí se observa que hay registros duplicados, por lo tanto no es posible agregar una condición de primary key:

1
2
mysql> ALTER TABLE tabla ADD PRIMARY KEY (campo1);
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

Entonces, lo primero que se tendría que hacer es eliminar los registros duplicados... para eso, puedes seguir esta serie de pasos que es una de las formas típicas para eliminar duplicados:

1. Hacemos una consulta tipo DISTINCT, para asegurarte que no queden registros duplicados:

1
2
3
4
5
6
7
8
9
10
mysql> SELECT DISTINCT campo1, campo2
    -> FROM tabla;
+--------+--------+
| campo1 | campo2 |
+--------+--------+
|      1 | uno    |
|      2 | dos    |
|      3 | tres   |
+--------+--------+
3 rows in set (0.00 sec)

2. Creamos una tabla TEMPORAL con el resultado de esta consulta;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> CREATE TABLE tabla_temporal AS
    -> SELECT DISTINCT campo1, campo2
    -> FROM tabla;
Query OK, 3 rows affected (0.34 sec)
Records: 3  Duplicates: 0  Warnings: 0
 
mysql> SELECT * FROM tabla_temporal;
+--------+--------+
| campo1 | campo2 |
+--------+--------+
|      1 | uno    |
|      2 | dos    |
|      3 | tres   |
+--------+--------+
3 rows in set (0.00 sec)

3. Eliminas la tabla ORIGINAL que tiene los registros duplicados:

1
2
mysql> DROP TABLE tabla;
Query OK, 0 rows affected (0.20 sec)

4. RENOMBRAS la tabla temporal con el nombre de tu tabla original:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> RENAME TABLE tabla_temporal TO tabla;
Query OK, 0 rows affected (0.10 sec)
 
mysql> SELECT * FROM tabla;
+--------+--------+
| campo1 | campo2 |
+--------+--------+
|      1 | uno    |
|      2 | dos    |
|      3 | tres   |
+--------+--------+
3 rows in set (0.00 sec)

5. AGREGAS la restricción de PRIMARY KEY:

1
2
3
mysql> ALTER TABLE tabla ADD PRIMARY KEY (campo1);
Query OK, 0 rows affected (0.50 sec)
Records: 0  Duplicates: 0  Warnings: 0

De esta manera, si se intenta insertar nuevamente una llave duplicada, el motor de BD's no lo permitirá:

1
2
mysql> INSERT INTO tabla VALUES (1, 'uno');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

Esto es lo que te pedía en el punto 1...

haz la prueba y nos comentas.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar