Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 从一组值中,如何查找未存储在表中的值';谁的专栏?_Mysql - Fatal编程技术网

Mysql 从一组值中,如何查找未存储在表中的值';谁的专栏?

Mysql 从一组值中,如何查找未存储在表中的值';谁的专栏?,mysql,Mysql,我有一个可能存储数十万个整数的表: desc id_key_table; +----------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------------+--------------+------+-----+---------+-------+ | id_key

我有一个可能存储数十万个整数的表:

desc id_key_table;

+----------------+--------------+------+-----+---------+-------+
| Field          | Type         | Null | Key | Default | Extra |
+----------------+--------------+------+-----+---------+-------+
| id_key         | int(16)      | NO   | PRI | NULL    |       |
+----------------+--------------+------+-----+---------+-------+
从一个程序中,我有一个大的整数集。我想看看这些整数中哪些不在上面的id\u key列中

到目前为止,我提出了以下方法:

1) 迭代每个整数并执行以下操作:

select count(*) count from id_key_table where id_key = :id_key
当计数为0时,表中缺少id_键

这似乎是一种可怕的方式


2) 创建一个临时表,将每个值插入临时表,并对两个表执行联接

create temporary table id_key_table_temp (id_key int(16) primary key );

insert into id_key_table_temp values (1),(2),(3),...,(500),(501);

select temp.id_key
from id_key_table_temp temp left join id_key_table as main 
         on temp.id_key = main.id_key 
where main.killID is null;

drop table id_key_table_temp;
这似乎是最好的方法,但是,我相信还有一种更好的方法我还没有想到。我希望不必创建临时表并使用一个查询来确定缺少哪些整数

对于这种类型的搜索是否有适当的查询


(MySQL)

使用问题中给出的第二个示例中的代码,我创建了两个存储过程(SP):一个SP加载素数作为键的示例表,另一个SP查找缺少的整数

以下是第一个SP:

DELIMITER $$

DROP PROCEDURE IF EXISTS `test`.`CreateSampleTable` $$
CREATE PROCEDURE `test`.`CreateSampleTable` (maxinttoload INT)
BEGIN

  DECLARE X,OKTOUSE,MAXLOOP INT;

  DROP TABLE IF EXISTS test.id_key_table;
  CREATE TABLE test.id_key_table (id_key INT(16)) ENGINE=MyISAM;

  SET X=2;
  WHILE X <= maxinttoload DO
    INSERT INTO test.id_key_table VALUES (X);
    SET X = X + 1;
  END WHILE;
  ALTER TABLE test.id_key_table ADD PRIMARY KEY (id_key);

  SET MAXLOOP = FLOOR(SQRT(maxinttoload));
  SET X = 2;
  WHILE X <= MAXLOOP DO
    DELETE FROM test.id_key_table WHERE MOD(id_key,X) = 0 AND id_key > X;
    SELECT MIN(id_key) INTO OKTOUSE FROM test.id_key_table WHERE id_key > X;
    SET X = OKTOUSE;
  END WHILE;
  OPTIMIZE TABLE test.id_key_table;

  SELECT * FROM test.id_key_table;

END $$

DELIMITER ;
以下是第二个SP的运行情况,使用25作为要比较的完整列表:

mysql> CALL test.GetMissingIntegers(25);
+--------+
| id_key |
+--------+
|      1 |
|      4 |
|      6 |
|      8 |
|      9 |
|     10 |
|     12 |
|     14 |
|     15 |
|     16 |
|     18 |
|     20 |
|     21 |
|     22 |
|     24 |
|     25 |
+--------+
16 rows in set (0.03 sec)

Query OK, 0 rows affected (0.05 sec)

mysql>
虽然这种解决方案适用于小样本,但大列表却成了一个令人头疼的问题。您可能希望临时表(不要反复使用CREATE TEMPORATE table,只使用CREATE table一次)永久加载数字1。。MAX(id_key)并通过id_key_表上的触发器填充该永久临时表


我只是好奇地问一个问题:您这样做是为了看看表中的自动增量键是否可以重用吗?

第二个选项是最好的。(检查3种可能的编写查询的方法的速度,
LEFT JOIN-IS NULL
您编写的,
不在
版本中,
不存在
方式。在MySQL中,通常第一个或第三个更快)。我想您要检查的id_键不是顺序的,并且(1-501)只是一个示例。ypercube,正确,这些键不是按顺序排列的。事实上,可能存在很大的差距:例如,100000-150000填充的是缺失的随机数,然后230000-400000填充的是缺失的随机数,等等。“你这样做是为了看看表中的自动增量键是否可以重用吗?”“不可能,这是胡说八道。我收到的数据集足以提供唯一的标识符,我只是试图不重新处理已经处理过的数据。数据往往会从不同的来源重复(但仍然提供相同的一致唯一标识符)。@Clinton我见过其他开发人员实际执行这种疯狂的演讲,所以我听到了。我将坚持我的第二种解决方案,并将临时表作为永久表。谢谢你的反馈!
mysql> CALL test.CreateSampleTable(25);
+-------------------+----------+----------+----------+
| Table             | Op       | Msg_type | Msg_text |
+-------------------+----------+----------+----------+
| test.id_key_table | optimize | status   | OK       |
+-------------------+----------+----------+----------+
1 row in set (0.16 sec)

+--------+
| id_key |
+--------+
|      2 |
|      3 |
|      5 |
|      7 |
|     11 |
|     13 |
|     17 |
|     19 |
|     23 |
+--------+
9 rows in set (0.17 sec)

mysql>
mysql> CALL test.GetMissingIntegers(25);
+--------+
| id_key |
+--------+
|      1 |
|      4 |
|      6 |
|      8 |
|      9 |
|     10 |
|     12 |
|     14 |
|     15 |
|     16 |
|     18 |
|     20 |
|     21 |
|     22 |
|     24 |
|     25 |
+--------+
16 rows in set (0.03 sec)

Query OK, 0 rows affected (0.05 sec)

mysql>