MySQL中的数字序列

时间:2010-03-22 20:30:09

标签: python sql mysql sequence xrange

在Python中,如果我想要一个0-9(含)的序列,我会使用xrange(0,10)。有没有办法在MySQL中做到这一点?

4 个答案:

答案 0 :(得分:2)

由于没有xrange这样的东西,可以使用一个用整数存储的单独表(如前所述),或者只是创建一个存储过程来完成这项工作:

DROP PROCEDURE IF EXISTS xrange;
DELIMITER //
CREATE PROCEDURE xrange(x INT, y INT)
BEGIN
  DECLARE i INT DEFAULT x;
  CREATE TEMPORARY TABLE xrange_tmp (c1 INT);
  WHILE i < y DO
    INSERT INTO xrange_tmp VALUES (i);
    SET i = i + 1;
  END WHILE;
END;
//

用法:

CALL xrange(-2,10);
SELECT c1 FROM xrange_tmp;
DROP TABLE xrange_tmp;

上面显然比创建一个带整数的ready表要慢。但它更灵活。

答案 1 :(得分:0)

您可以使用LAST_INSERT_ID()来模拟MySQL中的序列。

  

如果expr作为参数给出   LAST_INSERT_ID(),值的   参数由函数返回   并被记为下一个值   由LAST_INSERT_ID()返回。这个   可以用来模拟序列:

     

创建一个表来保存序列   反击并初始化它:

CREATE TABLE sequence (id INT NOT NULL);
INSERT INTO sequence VALUES (0);
  

使用该表生成如下序列号:

  UPDATE sequence SET id=LAST_INSERT_ID(id+1);
  SELECT LAST_INSERT_ID();
  

UPDATE语句递增   

序列计数器      
    

接下来调用LAST_INSERT_ID()来     返回更新的值。 SELECT     语句检索该值。该     mysql_insert_id()C API函数可以     也被用来获得价值。看到     第21.9.3.37节,     “mysql_insert_id()”。

  

阅读更多here以及对其进行的一些讨论here

答案 2 :(得分:0)

尝试使用integers table变体。这个来自Xaprb

create table integers(i int unsigned not null);
insert into integers(i) values (0), (1), (2), (3), (4), (5), (6), (7), (8), (9);

select (hundreds.i * 100) + (tens.i * 10) + units.i as iii
from integers as units
    cross join integers as tens
    cross join integers as hundreds;

如果您将最后select个视图命名为xrange999,那么您可以简单地说:

SELECT iii FROM xrange999 WHERE iii BETWEEN 0 AND 9

(当然,你可以只使用十行integers表来做到这一点,但我发现一千个整数更有用。)

答案 3 :(得分:0)

如果Python是您的编程语言,您可以映射相同的Python范围以创建表单的INSERT语句:

INSERT INTO Table (IDCol) VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9)

不完全是你要求的,但是一行Python代码可以处理任何范围,直到MySQL语句的最大长度。