¿Cuál es una buena manera de trabajar con muchas filas en MySql, dado que tengo una larga lista de claves en una aplicación cliente que se conecta con ODBC?MySql: Operar en muchas filas usando la lista larga de PK compuestas
Nota: mi experiencia es en gran medida SQL Server, así que sé un poco, simplemente no MySQL específicamente.
La tarea consiste en eliminar algunas filas de 9 tablas, pero podría tener más de 5.000 pares de claves.
Empecé con el camino más fácil de bucle a través de todas las llaves y la presentación de una declaración para cada uno contra cada mesa, tales como:
DELETE FROM Table WHERE Key1 = 123 AND Key2 = 567 -- and 8 more tables
DELETE FROM Table WHERE Key1 = 124 AND Key2 = 568 -- and 8 more tables
DELETE FROM Table WHERE Key1 = 125 AND Key2 = 569 -- and 8 more tables
...
Excepto, que sale a 45.000 declaraciones separadas, que como te puedes imaginar es un poco lento.
Así que, sin preocuparme por el lenguaje de programación que estoy usando en el front-end, ¿cuál es una buena forma de enviar la lista para poder UNIRME y hacer la operación todo al mismo tiempo o al menos en lotes grandes? Aquí están mis ideas hasta el momento:
Crear una tabla temp e insertar a ella, y luego unirse. Con mucho gusto buscaré la sintaxis de MySQL para crear una tabla temporal, pero ¿es una buena ruta para seguir?
Suponiendo que utilizo una tabla temporal, ¿cuál es el mejor método para rellenar una tabla temporal? 5000
INSERT Table VALUES()
declaraciones?SELECT 123, 456 UNION ALL SELECT 124, 457
? Acabo de probar que MySql permite este tipo de SELECT que no se publica en una tabla. Pero SQL Server eventualmente explota si la lista es demasiado larga, ¿es esta una buena forma en MySQL? ¿Debo mantener la lista a unos pocos cientos a la vez?--CREATE Temp Table (I do not know the syntax in MySql yet) INSERT INTO TempTable SELECT 123, 456 UNION ALL SELECT 124, 457 UNION ALL SELECT 125, 458 DELETE T FROM Table T INNER JOIN TempTable X ON T.Key1 = X.Key1 AND T.Key2 = X.Key2
XML. Veo que MySQL 5.1 tiene algunas funciones XML, pero a partir de una búsqueda superficial, no parece ser compatible con convertir un trozo de texto XML en un conjunto de filas para unir. ¿Es eso cierto? Es extremadamente fácil para mí obtener los valores en XML.
Operación dividida virtual. Presumo en MySql que existe algún tipo de lenguaje de procedimiento posible. En SQL Server que podría escribir algo de código personalizado que analiza una cadena y lo convierte en un conjunto de filas:
CREATE PROCEDURE DoStuff @KeyString varchar(max) AS DECLARE @Keys TABLE ( Key1 int, Key2 int, PRIMARY KEY CLUSTERED (Key1, Key2) ) DECLARE @Pos int WHILE @Pos < Len(@KeyString) BEGIN -- loop to search for delimiting commas in @KeyString -- and insert pairs of parsed tokens to table variable @Keys END DELETE T FROM Table T INNER JOIN @Keys K ON T.Key1 = K.Key1 AND T.Key2 = K.Key2
Desde que estoy familiarizado con MySQL, realmente no saben cuales posibilidad de investigar en primer lugar, y agradecería algo de ayuda para salvarme de tomar una mala decisión y/o aprender por las malas.
Gracias Bill, parece dinamita. Analizaré el método LOAD DATA, aunque no estoy seguro de poder escribir fácilmente en dicho archivo. ¿Hay alguna otra forma de script para cargar la tabla temporal? Además, ¿podría elaborar un poco sobre el alcance de las tablas temporales (qué ocurre si dos sesiones intentan crear una tabla temporal con el mismo nombre, o el nombre ya existe como una tabla real, y la tabla temporal se destruye cuando la conexión cierra)? – ErikE
P.S. USAR es genial, desearía que SQL Server lo tuviera. – ErikE
Ojalá pudiera darle más de un voto positivo. Gracias por la profundidad y el detalle de tu respuesta. Admito que podría haber investigado todas estas cosas (y planeo hacerlo todavía), pero una buena respuesta es tan buena. – ErikE