2010-03-22 51 views
1

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

+0

的可能重复[我如何在mysql中连续发生器(http://stackoverflow.com/questions/701444/how-do-i-make-a-row-generator-in-mysql) – 2010-07-03 08:25:02

回答

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

+0

大家好,NebuSoft,谢谢你的回答。 我记得我Postgresql的日子里会有这样做的。我会沿线的东西: 从xrange(0,10)中选择x; 你没有意识到在MySQL中有这样的事情吗? – illuminatedtiger 2010-03-22 20:39:17

+0

我在MySQL中没有遇到过类似的东西。话虽如此,我提供的例子直接来自MySQL官方网站/文档。所以如果有更好的方法,我会怀疑当他们举例说明如何在我提供的方法中创建序列时他们会提到它。 – NebuSoft 2010-03-23 14:06:17

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; 

如果进行命名,比如,xrange999,去年select一个观点,那么你可以简单地说:

SELECT iii FROM xrange999 WHERE iii BETWEEN 0 AND 9 

(当然,你可以做到这一点只用但我发现一千个整数更有用一些。)

0

如果Python是您的编程语言,您可以映射相同的Python范围来创建一个形式为INSERT语句:

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

不完全符合您的要求,而是一行Python代码,可处理任何范围,最多可达MySQL语句的最大长度。

2

由于是x范围没有这样的东西,可以使用存储整数一个单独的表(如前面回答),或者只是做一个存储过程来完成这项工作:

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; 

上面显然会比用整数创建一个就绪表慢。虽然它更灵活。