在 Python 中,如果我想要一个从 0 到 9(含)的序列,我会使用 xrange(0,10) 。有没有办法在 MySQL 中做到这一点?
4 回答
由于没有 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;
以上显然会比使用整数创建准备好的表要慢。不过它更灵活。
您可以使用 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()”。
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
表来做到这一点,但我发现一千个整数更有用一些。)
如果 Python 是您的编程语言,您可以映射相同的 Python 范围以创建以下形式的 INSERT 语句:
INSERT INTO Table (IDCol) VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9)
不完全是您要求的,而是一行 Python 代码,可以处理任何范围,直到 MySQL 语句的最大长度。