2010-03-22 20 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; 

上面顯然會比用整數創建一個就緒錶慢。雖然它更靈活。