有谁知道OR
我可以在 MySQL 和 MSSQL DBMS 的单个查询中设置的最大条件数是多少?
2 回答
从您评论中的信息中,只需使用子查询。例如:
delete tblCustomers
where CustomerId in (select CustomerId from tblOtherTable)
更新
鉴于您的情况,只有两种可能的方法。
- 从 MSSQL 导出数据。然后将该数据导入 MySQL 服务器中的临时表。导入后,运行与上述类似的查询。
- 编写一个 C# 应用程序,它可以提取您想要的所有值并针对您的 MySQL 数据库运行一组 INSERT/UPDATE 查询。
第一个选项是迄今为止最好的,因为它相当简单并且运行速度很快。第二个选项不是很好,因为这意味着您将对 MSSQL 服务器中的每条记录执行 2 次查询。(找出记录是否存在,然后是 MySQL 服务器上的 INSERT 或 UPDATE 语句。
在MySQL中,一条 SQL 语句中可以包含的条件数受OR
一条 SQL 语句的最大长度限制,该最大长度受max_allowed_packet
变量设置的限制。
显示变量,如“max_allowed_packet”
(注意: for 的值max_allowed_packet
以字节而不是字符指定,如果您的 SQL 语句包含多字节字符,请注意这一点)。
当面临创建具有大量OR
条件的语句时,通常有不同的方式来执行相同的操作,例如一个IN (list)
或一个JOIN
操作。
MySQL 中一种更有效的方法是创建一个表并从文件中加载它。(这种方法的“大石头”困难在于使字符集编码兼容。)
如果您可以使用 latin1 或 utf8 编码从 SQL Server 生成一个 .CSV 文件(每个 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]*$
) 的字符表示,翻译应该没有任何问题。对于 latin1 和 utf8,数字字符 '0' 到 '9' 的编码是 x'30' 到 x'39',Windows 样式 CR+LF 是 x'0d0a'。