MySQL中的数字序列
在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;
上面的做法显然比直接创建一个包含整数的表要慢一些。不过,它更灵活。