在MySQL中生成一系列数字

如何从MySQL查询生成一系列连续的数字(每行一个),以便我可以将它们插入到表中?

例如:

nr 1 2 3 4 5 

我只想使用MySQL(而不是PHP或其他语言)。

如果您需要表中的logging,并且希望避免并发性问题,请按照以下步骤操作。

首先你创build一个表来存储你的logging

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

其次创build一个像这样的存储过程:

 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 

这里是一个没有循环的基于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 

以下是匹兹堡DBA解决scheme的硬件工程师版本:

 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; 

假设您想要将数字1到100插入到表格中。 只要你有一些至less有很多行的表(不pipe表的内容),那么这是我的首选方法:

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

想要一个从1开始的范围? 只要改变在连接上设置的@ROW即可。

大家都明白,这样做很不方便,所以小心使用

 SELECT id % 12 + 1 as one_to_twelve FROM any_large_table group by one_to_twelve 
 DECLARE i INT DEFAULT 0; WHILE i < 6 DO /* insert into table... */ SET i = i + 1; END WHILE; 

我知道(在MySQL中)创build一个长序列表的“最短”方式是(交叉)join一个现有的表。 由于任何(通用)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 

通常一个连接应该足以创build超过1M行 – 但多一个连接不会伤害:-) – 只要不要忘记设置一个限制。

如果你想包含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; 

你可以用数字来validation数字

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