2012-04-18 11 views
5

Ante todo soy muy nuevo en MySQL y yo tratando de aprender como voy.necesidad de modificar el MySQL Query para no permitir duplicados entradas en una tabla

Tengo un script que se ejecuta al cargar la página que recupera datos de tipo sindicado y lo agrega a una tabla de base de datos MySQL.

Todo lo que quiero hacer es añadir los nuevos datos que se encuentran en la tabla de base de datos sin añadir duplicados encontrados en un carga de la página anterior.

Mi tabla de base de datos es el siguiente:

// Creates a Database Table only if the Table does not already exist 
     mysql_query("CREATE TABLE IF NOT EXISTS $TableName(
      id INT NOT NULL AUTO_INCREMENT, 
      PRIMARY KEY (id), 
      Field_2 varchar(255) NOT NULL default '', 
      Post_Date int(11) NOT NULL default '0', 
      Field_4 varchar(10) NOT NULL default '', 
      Field_5 varchar(12) NOT NULL default '', 
      Field_6 longtext NOT NULL default '', 
      Field_7 longtext NOT NULL default '', 
      Field_8 longtext NOT NULL default '') ") or die(mysql_error() 
     ); 

Solo hay un índice como se muestra a continuación:

Action  Keyname Type Unique Packed Column Cardinality Collation Null Comment 
Edit Drop PRIMARY BTREE Yes No  id  830   A 

El campo post_date es siempre único (formato UNIX), por lo que puede ser utilizado para determinar duplicados.

Actualmente estoy usando el siguiente código para introducir los datos en la tabla de base de datos y luego eliminar los duplicados:

// Enter the $sql Data into the MySQL Database Table 
    mysql_query("INSERT INTO $TableName (id, Field_2, Post_Date, Field_4, Field_5, Field_6, Field_7, Field_8) VALUES ".implode(',', $sql)); 
// Removes Duplicates from the MySQL Database Table based on the 'Post_Date' field 
    mysql_query("Alter IGNORE table $TableName add unique key (Post_Date)"); 
// Deletes the added index key created by the Removes Duplicates function 
    mysql_query("ALTER TABLE $TableName DROP INDEX Post_Date"); 

El problema es que la consulta DROP INDEX falla si la página web es golpeado a muchas veces y resultados en muchos índices que se crean.

Aunque tengo una solución para eliminar los índices adicionales, me dijeron por otros usuarios para evitar este método completamente y probar con otro método similar a INSERT ... ON DUPLICATE KEY UPDATE http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

Pero don' Saber cómo construir la consulta para que funcione.

Hice mi investigación y encontró la siguiente página web que indica cómo introducir datos en una tabla sin duplicados: http://www.tutorialspoint.com/mysql/mysql-handling-duplicates.htm

Los estados sitio web de este ejemplo:

mysql> INSERT IGNORE INTO person_tbl (last_name, first_name) -> VALUES('Jay', 'Thomas'); 

pero no sabe cómo para modificar mi código de consulta para que funcione

He intentado añadir Ignorar para la consulta, sino que también permite entradas duplicadas en la tabla:

mysql_query("INSERT IGNORE INTO $TableName (id, Field_2, Post_Date, Field_4, Field_5, Field_6, Field_7, Field_8) VALUES ".implode(',', $sql)); 

Cualquier ayuda se agradece, gracias.

Respuesta

3

Ponga su índice único para evitar registros duplicados y realice sus consultas de inserción con la adición de ignorar palabra clave para no recibir errores (si su inserción es duplicada) dice que la documentación y usted podría hacer eso.

La presencia de un índice único en una tabla que normalmente provoca un error de producirse si inserta un registro en la tabla que duplica una registro existente en la columna o columnas que definen el índice.

Utilice INSERTAR IGNORAR en lugar de INSERTAR. Si un registro no duplica una registro existente, MySQL inserta como de costumbre. Si el registro es un duplicado , la palabra clave IGNORE le dice a MySQL que lo descarte silenciosamente sin generar un error.

Editar:

muestra Check, en sqlfiddle:

http://sqlfiddle.com/#!2/4ad8a/3

Edit2:

CREATE TABLE IF NOT EXISTS TestTable(
    `id` INT(11) NOT NULL AUTO_INCREMENT, 
    `Field_2` VARCHAR(255) NOT NULL DEFAULT '', 
    `Post_Date` INT(11) NOT NULL DEFAULT '0', 
    `Field_4` VARCHAR(10) NOT NULL DEFAULT '', 
    `Field_5` VARCHAR(12) NOT NULL DEFAULT '', 
    `Field_6` LONGTEXT NOT NULL, 
    `Field_7` LONGTEXT NOT NULL, 
    `Field_8` LONGTEXT NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE INDEX `Post_Date` (`Post_Date`) 
) 
+0

Gracias, He intentado añadir IGNORE como se indica en el puesto, pero fracasaron. ¿Cómo modificaría el siguiente código de consulta para hacerlo ?: mysql_query ("INSERT INTO $ TableName (id, Field_2, Post_Date, Field_4, Field_5, Field_6, Field_7, Field_8) VALUES" .implode (',', $ sql)) ; – Sammy

+0

Como escribí siempre tengo que mantener un índice único. Ignorar simplemente ignora el error si tiene un error de índice único. Si no tienes un índice único, no obtienes ningún error. Creé su tabla de muestra y consultas de muestra en sqlfiddle. Puedes verificar y probar allí. Verifique el enlace que proporcioné en mi respuesta editada. –

+0

Gracias por el ejemplo. ¿Pero no es esto lo mismo que mi línea IGNORE agregada que no funcionó? mysql_query ("INSERT IGNORE INTO $ TableName (id, Field_2, Post_Date, Field_4, Field_5, Field_6, Field_7, Field_8) VALUES" .implode (',', $ sql)); Estoy usando una implosión para los valores también. ¿Cómo puedo hacer que esta línea de código funcione? – Sammy

Cuestiones relacionadas