在Python中,如果我想要一个0-9(含)的序列,我会使用xrange(0,10)。有没有办法在MySQL中做到这一点?
答案 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()”。
答案 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语句的最大长度。