0

有谁知道OR我可以在 MySQL 和 MSSQL DBMS 的单个查询中设置的最大条件数是多少?

4

2 回答 2

0

从您评论中的信息中,只需使用子查询。例如:

delete tblCustomers
where CustomerId in (select CustomerId from tblOtherTable)

更新
鉴于您的情况,只有两种可能的方法。

  1. 从 MSSQL 导出数据。然后将该数据导入 MySQL 服务器中的临时表。导入后,运行与上述类似的查询。
  2. 编写一个 C# 应用程序,它可以提取您想要的所有值并针对您的 MySQL 数据库运行一组 INSERT/UPDATE 查询。

第一个选项是迄今为止最好的,因为它相当简单并且运行速度很快。第二个选项不是很好,因为这意味着您将对 MSSQL 服务器中的每条记录执行 2 次查询。(找出记录是否存在,然后是 MySQL 服务器上的 INSERT 或 UPDATE 语句。

于 2013-08-16T21:28:23.247 回答
0

MySQL中,一条 SQL 语句中可以包含的条件数受OR一条 SQL 语句的最大长度限制,该最大长度受max_allowed_packet变量设置的限制。

显示变量,如“max_allowed_pa​​cket”

(注意: 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'。

于 2013-08-16T21:30:03.667 回答