2008-10-09 70 views
39

如何從MySQL查詢生成一系列連續的數字(每行一個),以便我可以將它們插入到表中?在MySQL中生成一系列數字

例如:

nr 
1 
2 
3 
4 
5 

我想只使用MySQL的這個(不是PHP或其他語言)。

+0

是否要將其添加到現有記錄或全新表格? – Sklivvz 2008-10-09 11:07:59

+0

這將是新的記錄。 – nicudotro 2008-10-09 11:10:40

+1

爲什麼你不能使用auto_increment列? – Rob 2008-10-09 14:10:26

回答

25

如果您需要表中的記錄並且希望避免併發問題,請按照以下步驟操作。

首先您必須在其中存儲您的記錄

CREATE TABLE `incr` (
    `Id` int(11) NOT NULL auto_increment, 
    PRIMARY KEY (`Id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

表其次創建這樣一個存儲過程:

DELIMITER ;; 
CREATE PROCEDURE dowhile() 
BEGIN 
    DECLARE v1 INT DEFAULT 5; 
    WHILE v1 > 0 DO 
    INSERT incr VALUES (NULL); 
    SET v1 = v1 - 1; 
    END WHILE; 
END;; 
DELIMITER ; 

最後撥打SP:

CALL dowhile(); 
SELECT * FROM incr; 

結果

Id 
1 
2 
3 
4 
5 
5
DECLARE i INT DEFAULT 0; 

WHILE i < 6 DO 
    /* insert into table... */ 
    SET i = i + 1; 
END WHILE; 
54

這裏有一種方法來做到基於set的沒有循環。這也可以作爲重複使用的視圖。這個例子顯示了從0到999的序列的生成,但是當然,它可以被修改以適合。

INSERT INTO 
    myTable 
    (
    nr 
    ) 
SELECT 
    SEQ.SeqValue 
FROM 
(
SELECT 
    (HUNDREDS.SeqValue + TENS.SeqValue + ONES.SeqValue) SeqValue 
FROM 
    (
    SELECT 0 SeqValue 
    UNION ALL 
    SELECT 1 SeqValue 
    UNION ALL 
    SELECT 2 SeqValue 
    UNION ALL 
    SELECT 3 SeqValue 
    UNION ALL 
    SELECT 4 SeqValue 
    UNION ALL 
    SELECT 5 SeqValue 
    UNION ALL 
    SELECT 6 SeqValue 
    UNION ALL 
    SELECT 7 SeqValue 
    UNION ALL 
    SELECT 8 SeqValue 
    UNION ALL 
    SELECT 9 SeqValue 
    ) ONES 
CROSS JOIN 
    (
    SELECT 0 SeqValue 
    UNION ALL 
    SELECT 10 SeqValue 
    UNION ALL 
    SELECT 20 SeqValue 
    UNION ALL 
    SELECT 30 SeqValue 
    UNION ALL 
    SELECT 40 SeqValue 
    UNION ALL 
    SELECT 50 SeqValue 
    UNION ALL 
    SELECT 60 SeqValue 
    UNION ALL 
    SELECT 70 SeqValue 
    UNION ALL 
    SELECT 80 SeqValue 
    UNION ALL 
    SELECT 90 SeqValue 
    ) TENS 
CROSS JOIN 
    (
    SELECT 0 SeqValue 
    UNION ALL 
    SELECT 100 SeqValue 
    UNION ALL 
    SELECT 200 SeqValue 
    UNION ALL 
    SELECT 300 SeqValue 
    UNION ALL 
    SELECT 400 SeqValue 
    UNION ALL 
    SELECT 500 SeqValue 
    UNION ALL 
    SELECT 600 SeqValue 
    UNION ALL 
    SELECT 700 SeqValue 
    UNION ALL 
    SELECT 800 SeqValue 
    UNION ALL 
    SELECT 900 SeqValue 
    ) HUNDREDS 
) SEQ 
+12

這就是創新 – 2009-08-02 12:13:47

42

這裏有一個硬件工程師的版本的匹茲堡DBA的解決方案:

SELECT 
    (TWO_1.SeqValue + TWO_2.SeqValue + TWO_4.SeqValue + TWO_8.SeqValue + TWO_16.SeqValue) SeqValue 
FROM 
    (SELECT 0 SeqValue UNION ALL SELECT 1 SeqValue) TWO_1 
    CROSS JOIN (SELECT 0 SeqValue UNION ALL SELECT 2 SeqValue) TWO_2 
    CROSS JOIN (SELECT 0 SeqValue UNION ALL SELECT 4 SeqValue) TWO_4 
    CROSS JOIN (SELECT 0 SeqValue UNION ALL SELECT 8 SeqValue) TWO_8 
    CROSS JOIN (SELECT 0 SeqValue UNION ALL SELECT 16 SeqValue) TWO_16; 
+3

很好,在那裏。 – 2012-05-19 03:57:56

12

比方說,你想通過100插入數字1到表。只要你有至少具有許多行(不要緊表的內容),其他一些表,那麼這是我的首選方法:

INSERT INTO pivot100 
SELECT @ROW := @ROW + 1 AS ROW 
FROM someOtherTable t 
join (SELECT @ROW := 0) t2 
LIMIT 100 
; 

要與比其他東西開始了一系列1?只需更改連接上設置的@ROW即可。

6

大家都明白了,這是相當哈克所以請小心

SELECT id % 12 + 1 as one_to_twelve FROM any_large_table group by one_to_twelve 
0

「最短」的方式,我知道(在MySQL)用於創建一個表,一個長序列是(交叉)加入一個現有的表格。由於任何(公共)MySQL服務器有information_schema.COLUMNS表我會用它:

DROP TABLE IF EXISTS seq; 
CREATE TABLE seq (i MEDIUMINT AUTO_INCREMENT PRIMARY KEY) 
    SELECT NULL AS i 
    FROM information_schema.COLUMNS t1 
    JOIN information_schema.COLUMNS t2 
    JOIN information_schema.COLUMNS t3 
    LIMIT 100000; -- <- set your limit here 

通常一個連接應該足以創造超過100萬行 - 但是,一個更加入不會傷害:-) - 不過不要忘記設定一個限制。

如果要包含0,應該「刪除」AUTO_INCEMENT屬性。

ALTER TABLE seq ALTER i DROP DEFAULT; 
ALTER TABLE seq MODIFY i MEDIUMINT; 

現在你可以插入0

INSERT INTO seq (i) VALUES (0); 

數和負數以及

INSERT INTO seq (i) SELECT -i FROM seq WHERE i <> 0; 

您可以

SELECT MIN(i), MAX(i), COUNT(*) FROM seq; 
0

我想分享的想法驗證號碼並不是一個確切的答案回答這個問題,但可以對某些人有用,所以我想分享一下。

如果您經常只需要有限的一組數字,那麼創建一個包含您可能需要的數字的表格並且每次只使用該表格可能會有所幫助。例如:

CREATE TABLE _numbers (num int); 
INSERT _numbers VALUES (0), (1), (2), (3), ...; 

只有當你需要的數字低於某一合理的限度,所以不要用它來生成序列1 ... 1萬,但是可用於數字1這可應用於...例如10K。

如果你在_numbers表號的這個名單,那麼你可以這樣寫查詢,獲得一個字符串的單個字符:

SELECT number, substr(name, num, 1) 
    FROM users 
    JOIN _numbers ON num < length(name) 
    WHERE user_id = 1234 
    ORDER BY num; 

如果你需要比10K更大的數字,那麼你可以加入表格本身:

SELECT n1.num * 10000 + n2.num 
    FROM _numbers n1 
    JOIN _numbers n2 
    WHERE n1 < 100 
    ORDER BY n1.num * 10000 + n2.num; -- or just ORDER BY 1 meaning the first column