我有一张表格,其中包含 auto inc. 的正常设置。身份证。一些行已被删除,因此 ID 列表可能如下所示:
(1, 2, 3, 5, 8, ...)
然后,从另一个来源(编辑:另一个来源 = 不在数据库中)我有这个数组:
(1, 3, 4, 5, 7, 8)
我正在寻找一个可以在数据库上使用的查询,以从我拥有的数组中获取表中不存在的 ID:s 列表。这将是:
(4, 7)
这样的存在吗?我现在的解决方案是创建一个临时表,以便命令“WHERE table.id IS NULL”起作用,或者可能更糟,使用 PHP 函数 array_diff 查看从表中检索所有 ID 后缺少的内容。
由于 ID 列表接近数百万或行,我急于找到最佳解决方案。
谢谢! /托马斯
编辑 2:
我的主要应用程序是一个相当简单的表格,其中填充了很多行。此应用程序是使用浏览器管理的,我使用 PHP 作为代码的解释器。
此表中的所有内容都将导出到另一个系统(第 3 方产品),除了手动使用该程序中的导入功能外,还没有其他方法可以执行此操作。也可以在其他系统中插入新行,尽管约定的路由永远不会这样做。
问题是我的系统不能 100% 确定用户从他/她按下“导出”键时所做的一切都是正确的。或者,在其他系统中从未创建过任何行。
我可以从其他系统中获取一个 CSV 文件,其中包含该系统的所有行。因此,通过比较 CSV 文件和我的表格,我可以查看是否: * 其他系统中缺少本应导入的任何行 * 如果有人在其他系统中创建了行
问题不是“解决它”。它是 is 的最佳解决方案,因为行中有太多数据。
再次感谢!
/托马斯
最佳答案
我们可以使用没有选项的MYSQL。
SELECT id
FROM table_one
WHERE id NOT IN ( SELECT id FROM table_two )
已编辑
如果您从 csv 文件中获取源代码,那么您只需将这些值直接放入,例如:
我假设 CSV 类似于 1,2,3,...,n
SELECT id
FROM table_one
WHERE id NOT IN ( 1,2,3,...,n );
编辑 2
或者如果您想选择其他方式,则可以使用 mysqlimport
将数据导入 MySQL 数据库中的临时表并检索结果并删除该表。
喜欢:
创建表
CREATE TABLE my_temp_table(
ids INT,
);
加载 .csv 文件
LOAD DATA LOCAL INFILE 'yourIDs.csv' INTO TABLE my_temp_table
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
(ids);
选择记录
SELECT ids FROM my_temp_table
WHERE ids NOT IN ( SELECT id FROM table_one )
丢表
DROP TABLE IF EXISTS my_temp_table
关于mysql - SQL:选择一个表中不存在的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6731797/