Какой хороший способ работы со многими строками в MySql, учитывая, что у меня есть длинный список ключей в клиентском приложении, которое соединяется с ODBC?
Примечание: мой опыт в основном основан на SQL Server, поэтому я немного знаю, но не MySQL, в частности.
Задача состоит в том, чтобы удалить несколько строк из 9 таблиц, но у меня может быть более 5000 пар ключей.
Я начал с простого способа циклического перебора всех моих ключей и отправки выписки для каждого из них против каждой таблицы, например:
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
...
За исключением того, что получается 45 000 отдельных утверждений, которые, как вы можете себе представить, немного медленны.
Итак, не беспокоясь о языке программирования, который я использую во внешнем интерфейсе, каков хороший способ отправки списка, чтобы я мог ПРИСОЕДИНЯТЬСЯ и выполнять операцию одновременно или хотя бы большими партиями? Вот мои идеи на данный момент:
Создайте временную таблицу и вставьте в нее, затем присоединитесь. Я с радостью найду синтаксис MySQL для создания временной таблицы, но разве это хороший путь?
Если я использую временную таблицу, какой метод является лучшим для заполнения временной таблицы ? 5000 INSERT Table VALUES ()
заявлений? SELECT 123, 456 UNION ALL SELECT 124, 457
? Я только что проверил, что MySql допускает такой тип SELECT, который не выдается против таблицы. Но SQL Server в конечном итоге взрывается, если список становится слишком длинным, так что это хороший способ в MySQL? Должен ли я просто сохранить список до нескольких сотен сразу?
--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 . Я вижу, что MySQL 5.1 имеет некоторые функции XML, но из беглого поиска он не поддерживает превращение фрагмента текста XML в набор строк, к которому можно присоединиться. Это правда? Мне очень легко получить значения в XML.
Виртуальная разделенная операция . Я предполагаю, что в MySql есть какой-то процедурный язык. В SQL Server я мог бы написать некоторый пользовательский код, который анализирует строку и превращает ее в набор строк:
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
Так как я незнаком с MySQL, я действительно не знаю, какую возможность сначала исследовать, и я был бы признателен за некоторую помощь, чтобы уберечь меня от неправильного решения и / или трудного обучения.