2

在 Python 中,如果我想要一个从 0 到 9(含)的序列,我会使用 xrange(0,10) 。有没有办法在 MySQL 中做到这一点?

4

4 回答 4

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;

以上显然会比使用整数创建准备好的表要慢。不过它更灵活。

于 2010-03-25T09:59:26.560 回答
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()”。

阅读更多here以及一些关于它的讨论here

于 2010-03-22T20:36:49.700 回答
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表来做到这一点,但我发现一千个整数更有用一些。)

于 2010-03-22T20:41:10.000 回答
0

如果 Python 是您的编程语言,您可以映射相同的 Python 范围以创建以下形式的 INSERT 语句:

INSERT INTO Table (IDCol) VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9)

不完全是您要求的,而是一行 Python 代码,可以处理任何范围,直到 MySQL 语句的最大长度。

于 2010-03-22T20:50:23.833 回答