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.
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
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. –
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