Создание "таблицы чисел" в MySQL
Я пытаюсь создать большую таблицу последовательных чисел в MySQL.
Я просто хочу 2 столбца; первичный ключ и столбец чисел с диапазоном 0-X, где X очень большой. Прибл. 64 000 строк должны это сделать. Я пробовал этот код безуспешно:
CREATE TABLE numbers (
number INT NOT NULL
CONSTRAINT XPKnumbers
PRIMARY KEY CLUSTERED (number)
)
INSERT INTO numbers (number) VALUES (0)
DECLARE @i INT
SET @i = 20
WHILE 0 < @i
BEGIN
INSERT INTO numbers (number)
SELECT number + (SELECT 1 + Max(number) FROM numbers)
FROM numbers
SET @i = @i - 1
END
SELECT * FROM numbers
и я получаю эту ошибку:
# 1064 - у вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса, который можно использовать рядом с 'CONSTRAINT XPKnumbers PRIMARY KEY CLUSTERED (number)) INSERT INTO n' в строке 3
У кого-нибудь есть предложения, чтобы сделать эту работу?
Ответы
Ответ 1
Вам не нужны точки с запятой, запятые и даже после исправления синтаксиса, все равно не рекомендуется выбирать max из таблицы каждый раз, просто вставляя еще одну строку в цикл.
Снимите это и используйте генераторы из http://use-the-index-luke.com/blog/2011-07-30/mysql-row-generator:
CREATE OR REPLACE VIEW generator_16
AS SELECT 0 n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL
SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL
SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL
SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL
SELECT 12 UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL
SELECT 15;
CREATE OR REPLACE VIEW generator_256
AS SELECT ( ( hi.n << 4 ) | lo.n ) AS n
FROM generator_16 lo, generator_16 hi;
CREATE OR REPLACE VIEW generator_4k
AS SELECT ( ( hi.n << 8 ) | lo.n ) AS n
FROM generator_256 lo, generator_16 hi;
CREATE OR REPLACE VIEW generator_64k
AS SELECT ( ( hi.n << 8 ) | lo.n ) AS n
FROM generator_256 lo, generator_256 hi;
CREATE OR REPLACE VIEW generator_1m
AS SELECT ( ( hi.n << 16 ) | lo.n ) AS n
FROM generator_64k lo, generator_16 hi;
И если по какой-то причине вам действительно нужна таблица чисел, просто выполните:
INSERT INTO numbers(number)
SELECT n FROM generator_64k WHERE n < 64000
Ответ 2
Вам не хватает запятой между столбцом и объявлением ограничения:
CREATE TABLE numbers (
number INT NOT NULL,
CONSTRAINT XPKnumbers
PRIMARY KEY CLUSTERED (number)
)
Ответ 3
Начиная с MySQL 8.0, вы можете использовать RECURSIVE CTE для создания таблицы подсчета:
SET @@cte_max_recursion_depth = 5000;
WITH RECURSIVE cte AS
(
SELECT 1 AS i
UNION ALL
SELECT i+1
FROM cte
WHERE i < 3000
)
SELECT *
FROM cte;
DBFiddle Demo
Ответ 4
Здесь быстрый и простой способ создать список чисел. Выполнение этого запроса с использованием MySQL произвело список из 64 000 чисел в последовательности за 0,561 секунды.
set @i = 0;
SELECT * FROM (
SELECT @i:[email protected]+1 AS IndexNo FROM my_table -- any real table can be used here
HAVING
@i < 64000
)x