【发布时间】:2018-01-29 21:28:06
【问题描述】:
我有一个数组:
[1, 2, 3, 5]
我有一张桌子:
+--------+
| number |
+--------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+--------+
我想要做的是比较两者并从表中删除差异。所以在这种情况下,4。
最好的方法是什么? (我正在使用 MySQL(i) 和 php)
以下方法可行,但也有缺点:
-
遍历数组并手动将每个项目添加到
WHERE子句的IN部分:DELETE FROM tbl WHERE number NOT IN (1, 2, 3, 5)问题是这是不安全字符串的潜在风险,并且 sql 查询有大小限制。
-
使用数组创建一个临时表并使用它进行比较:
DELETE FROM tbl WHERE number NOT IN (SELECT num FROM tmp)这非常耗费资源(为每个连接创建和删除一个新表)并且速度很慢。
【问题讨论】:
-
SQL 语句的大小限制是多少?即使有相当大的数组,我也没有遇到过这种情况。并且 - 您不必迭代数组,您可以使用
implode或者 - 最好使用准备好的语句,例如 this answer - 这将防止您关注的不安全字符串问题。 -
@cale_b 该链接中的答案有点天才。感谢您分享。
-
除此之外,只要您的临时表不是那么大或不经常创建,您还可以指定
MEMORY作为存储引擎以加快它们的性能/生命周期。 -
sql参数限制为apparently在50k到60k之间。我的桌子现在不是那么大,但它对未来的证明很好。
-
定义“最佳”。