鉴于我在与 ODBC 连接的客户端应用程序中有很长的键列表,那么在 MySql 中处理多行的好方法是什么?
注意:我的经验主要是 SQL Server,所以我知道一点,只是不是专门针对 MySQL。
任务是从 9 个表中删除一些行,但我可能有超过 5,000 个密钥对。
我从简单的方法开始,循环遍历我的所有键并针对每个表为每个键提交一个语句,例如:
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,我真的不知道首先要调查哪种可能性,我希望能得到一些帮助,以免我做出错误的决定和/或艰难地学习。