MySQL中的数字序列

2 投票
4 回答
1624 浏览
提问于 2025-04-15 20:43

在Python中,如果我想要一个从0到9(包括9)的数字序列,我会用xrange(0,10)。那么在MySQL中,有没有办法做到这一点呢?

4 个回答

0

你可以使用 LAST_INSERT_ID() 来模拟 MySQL 中的序列。

如果你把一个值作为参数传给 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()”。

想了解更多,可以在 这里阅读相关内容,以及在 这里查看一些讨论。

0

试试一种叫做整数表的变体。这一部分内容来自于 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 表,但我觉得有一千个整数会更有用。)

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;

上面的做法显然比直接创建一个包含整数的表要慢一些。不过,它更灵活。

撰写回答