有人知道我可以在单个查询中为MySQL和MSSQL设置的最大数量的MySQL条件吗?
发布于 2013-08-16 21:28:23
从您的评论中的信息,只需使用子查询。例如:
delete tblCustomers
where CustomerId in (select CustomerId from tblOtherTable)更新
考虑到你的情况,只有两种可能的方法。
到目前为止,第一个选择是最好的,因为它相当简单,而且运行速度很快。第二个选项并不好,因为它意味着您将对MSSQL服务器中的每个记录执行2个查询。(查找记录是否存在,然后是MySQL服务器上的INSERT或UPDATE语句。
发布于 2013-08-16 21:30:03
在MySQL中,可以包含在SQL语句中的OR条件的数量受到SQL语句最大长度的限制,而OR语句的最大长度受max_allowed_packet变量设置的限制。
显示像'max_allowed_packet`‘这样的变量
(注意:max_allowed_packet的值是以字节而不是字符指定的,如果您的SQL语句包含多字节字符,则需要注意)。
当面对创建一个包含大量OR条件的语句时,通常有一种不同的方法来执行相同的操作,例如IN (list)或JOIN操作。
在MySQL中,一个更有效的方法是创建一个表并从一个文件中加载它。(这种方法的“大石头”难点在于使字符集编码兼容。)
如果您可以用.CSV或utf8编码从Server生成一个latin1或utf8文件(每个ID要删除一行),那么字符集匹配更像是速度提升而不是巨石。
在MySQL方面:
CREATE TABLE ids_to_delete (id INT PRIMARY KEY);
LOAD DATA INFILE '/tmp/ids_to_delete.csv' INTO TABLE ids_to_delete
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;
-- rows to be deleted (save a backup of this if you don't already have a mysqldump)
SELECT t.id
FROM my_target_table t
JOIN ids_to_delete d
ON d.id = t.id ;
-- perform the delete
-- DELETE t.*
-- FROM my_target_table t
-- JOIN ids_to_delete d
-- ON d.id = t.id ;为了只加载无符号整数值(^[0-9]*$)的字符表示,转换应该没有任何问题。数字字符'0‘到'9’的编码为x'30‘- x'39',latin1和utf8的窗口样式为x'0d0a’。
https://stackoverflow.com/questions/18282250
复制相似问题