Tengo una tabla con 3 columnas: id (pk), pageId (fk), name. Tengo un script php que vierte unos 5000 registros en la tabla, y aproximadamente la mitad son duplicados, con el mismo ID de página y nombre. La combinación de pageId y nombre debe ser única. ¿Cuál es la mejor manera de evitar que los duplicados se guarden en la tabla mientras recorro el script en php?La mejor manera de evitar la entrada duplicada en la base de datos mysql
Respuesta
El primer paso sería establecer una clave única de la tabla:
ALTER TABLE thetable ADD UNIQUE INDEX(pageid, name);
entonces usted tiene que decidir lo que quiere hacer cuando hay un duplicado. ¿Debe usted:
¿ignorarlo?
INSERT IGNORE INTO thetable (pageid, name) VALUES (1, "foo"), (1, "foo");
¿Sobrescribe el registro ingresado anteriormente?
INSERT INTO thetable (pageid, name, somefield) VALUES (1, "foo", "first") ON DUPLICATE KEY UPDATE (somefield = 'first') INSERT INTO thetable (pageid, name, somefield) VALUES (1, "foo", "second") ON DUPLICATE KEY UPDATE (somefield = 'second')
¿Hay alguna pregunta?
INSERT INTO thetable (pageid, name) VALUES (1, "foo"), (1, "foo") ON DUPLICATE KEY UPDATE (pagecount = pagecount + 1)
Puede establecer el PageID y el Nombre en un índice único en la base de datos MySQL. De esta forma, cuando insertas las filas, se producirá un error que PHP puede ignorar, y puedes ir a la siguiente fila.
Esto supone que está insertando filas individualmente. También conocido como:
foreach($large_data as $fields)
{
mysql_query("INSERT INTO TABLE (`Something`) VALUES('".$fields['something']."');
}
permitiendo intencionalmente mysql_query() para lanzar advertencias PHP cuando se pulse filas duplicadas es una especie de desordenado (it estorba su registro, es relativamente intensiva de recursos, etc.). Especialmente cuando prevenirlos en primer lugar es tan simple como usar la función 'INSERT IGNORE' de MySQL mencionada en otras soluciones. Además, insertar en un bucle es ineficaz cuando la sintaxis de inserción masiva está disponible. –
Desde un punto de MySQL puede hacer
alter table YOURTABLE add unique index(pageId, name);
Si su redacción es correcta y desea hacerlo desde PHP que puede hacer
$already_done = array();
foreach ($records as $record)
{
$unique_hash = md5($record['name'].$record['pageId']);
if (!in_array($unique_hash, $already_done))
{
$already_done[] = $unique_hash;
// sql insert here
}
}
de cualquier manera los debe ¿estás bien?
Por supuesto, si ya hay registros en la tabla * antes * de que se inicie la secuencia de comandos, esos no aparecerían en '$ already_done'. –
También puede ignorar el error con mysql: INSERT IGNORE INTO TABLE ... ignorará el error clave, omita ese inserto y pase al siguiente.
- 1. Datos MySQL - ¿La mejor manera de implementar la paginación?
- 2. La mejor manera de cifrar texto para almacenar la base de datos MySQL
- 3. entrada duplicada '0' para la clave 1 en mysql
- 4. La mejor manera de archivar la base de datos MySQL en vivo
- 5. ¿La mejor manera de almacenar una matriz en la base de datos MySQL?
- 6. Entrada duplicada para la clave 'PRIMARY' en mysql
- 7. Entrada duplicada '2147483647' para la clave 1
- 8. ¿Cuál es la mejor forma de evitar la entrada del usuario para expresiones regulares en MySQL?
- 9. Omitir inserción en entrada duplicada en mysql
- 10. Evitar la base de datos sqlite3 bloqueado
- 11. ¿La mejor manera de almacenar IP en la base de datos?
- 12. La mejor manera de almacenar tiempos de eventos en la base de datos (My) SQL
- 13. ¿La mejor manera de almacenar span a tiempo en una base de datos MySQL?
- 14. Cómo desinfectar la entrada de la base de datos ODBC?
- 15. Error al tirar de la base de datos mysql en la base de datos mysql local
- 16. ¿La mejor manera de validar la entrada de moneda?
- 17. La mejor manera de desinfectar la entrada en la aplicación web Java
- 18. La mejor manera de guardar solo día y mes en la base de datos
- 19. Diseño de la base de datos: ¿la mejor manera de mostrar el horario disponible?
- 20. La mejor práctica para grabar gran cantidad de éxitos en la base de datos MySQL
- 21. inserción de MySQL en clave duplicada; ¿borrar?
- 22. ¿La mejor manera de procesar la base de datos en fragmentos con Django QuerySet?
- 23. La mejor manera de almacenar valores enum en la base de datos - String o Int
- 24. La mejor manera de almacenar varios indicadores en la base de datos
- 25. ¿Cuál es la mejor manera de almacenar un valor monetario en la base de datos?
- 26. Mysql Error de entrada duplicada en ON ACTUALIZACIÓN DE LLAVE DUPLICADA
- 27. mysql insertar después de la eliminación falla debido a "entrada duplicada"
- 28. MySQL: ¿la mejor manera de almacenar direcciones MAC?
- 29. ¿La mejor manera de indexar datos de tabla de base de datos en Solr?
- 30. Evitar la edición duplicada/Bloquear registros de base mientras se edita: servidor de back-end
GRANDES gracias, esta fue una excelente respuesta a una pregunta que investigué durante un tiempo aquí en Stack Overlow. – capfu