Eu criei uma tabela assim,
CREATE TABLE Leaderboard(
userId bigint not null,
matchId bigint not null,
score mediumint not null,
country CHAR(10),
tournamentId int not null
)
Estou criando partidas de 5 pessoas, todas de 5 países distintos ("Reino Unido", "EUA", "ESPANHA", "ALEMANHA", "FRANÇA)
Quero inserir cerca de um milhão de entradas nesta tabela com os seguintes requisitos,
Uma partida será formada assim
usergermany | userUSA | userSPAIN | userUK | userFrance
então uma partida terá 5 usuários, todos de países distintos. Um torneio terá muitas partidas e um usuário só poderá jogar uma partida em um torneio.
Então, uma tabela de exemplo ficará assim
userid matchid score country tournamentid
...
988654 3877543 random USA 177
388654 3877543 random GERMANY 177
433432 3877543 random FRANCE 177
776212 3877543 random UK 177
1632987 3877543 random SPAIN 177
2113242 3877544 random SPAIN 177
2918974 3877544 random USA 177
111738 3877544 random UK 177
1772342 3877544 random FRANCE 177
1343243 3877544 random GERMANY 177
123131 3877545 random UK 178
1231414 3877545 random FRANCE 178
2858348 3877545 random GERMANY 178
1122432 3877545 random USA 178
2923434 3877545 random SPAIN 178
...
Um userId não pode existir duas vezes em um torneio,
Um país não pode existir duas vezes em uma partida (os grupos de partidas são formados por países distintos)
Além disso, como 5 jogadores competem numa partida, um matchid só aparecerá 5 vezes na mesa.
Quero inserir um milhão de entradas nesta tabela, sendo o ID do usuário aleatoriamente de 1 a 3 milhões com as restrições acima. 10 mil partidas para cada torneio, então serão 100 torneios começando em 1.
100 torneios, 10.000 partidas cada, perfazem até 1 milhão de linhas.
--ATUALIZAR--
create table seq_data as
with recursive tmp(x) as (
select 1
union all
select x+1 from tmp
limit 3000000
)
select * from tmp;
CREATE TABLE if not exists Leaderboard(
userId bigint not null,
matchId bigint not null,
score mediumint not null,
country CHAR(10),
tournamentId int not null
);
DELIMITER //
CREATE PROCEDURE InsertLeaderboardData()
BEGIN
DECLARE tournamentloop INT DEFAULT 0;
DECLARE matchloop INT DEFAULT 0;
DECLARE groupLoop INT DEFAULT 0;
DECLARE matchidKey INT DEFAULT 1;
WHILE tournamentloop < 1 DO
SET tournamentloop = tournamentloop + 1;
SET matchloop = 0;
WHILE matchloop < 10000 DO
SET matchidKey = matchidKey + 1;
SET matchloop = matchloop + 1;
SET groupLoop = 0;
WHILE groupLoop < 5 DO
SET groupLoop = groupLoop + 1;
INSERT INTO Leaderboard (userId, matchId, score, country, tournamentId)
VALUES (1, matchidKey, FLOOR(RAND() * 1000) + 1, ELT(groupLoop, "SPAIN", "FRANCE", "UK", "USA", "GERMANY"), tournamentloop);
SELECT matchidKey;
END WHILE;
END WHILE;
END WHILE;
END;
//
DELIMITER ;
CALL InsertLeaderboardData();
DROP PROCEDURE InsertLeaderboardData;
Isso funciona, mas lentamente, mas quero mais um recurso.
Quanto a INSERT INTO
defini userId
o valor como 1 por enquanto para editá-lo mais tarde. O que eu quero fazer é criar números sequenciados na tabela seq_data começando de 1 a 3 milhões. Para cada WHILE tournamentloop < 100 DO
escopo, quero obter 50 mil números DISTINTOS da seq_data
tabela. para que eu possa fornecer um ID aos usuários.
A moral é que nenhum userid pode aparecer duas vezes em um torneio. portanto, para cada escopo de torneio, preciso recuperar IDs aleatórios distintos e atribuí-los a linhas. Já criei a tabela para números sequenciados, não sei qual a melhor abordagem daqui.
-- Declaração
INSERT INTO Leaderboard (userId, matchId, score, country, tournamentId) VALUES (useridKey, matchidKey, FLOOR(RAND() * 1000) + 1, ELT(groupLoop, "SPAIN", "FRANCE", "UK", "USA", "GERMANY"), tournamentloop);
Eu transformo isso em
DECLARE tournamentloop INT DEFAULT 0;
DECLARE matchloop INT DEFAULT 0;
DECLARE groupLoop INT DEFAULT 0;
DECLARE matchidKey INT DEFAULT 1;
DECLARE useridKey INT DEFAULT 1;
PREPARE insertStmt FROM 'INSERT INTO Leaderboard (userId, matchId, score, country, tournamentId)VALUES (useridKey, matchidKey, FLOOR(RAND() * 1000) + 1, ELT(groupLoop, "SPAIN", "FRANCE", "UK", "USA", "GERMANY"), tournamentloop);';
EXECUTE insertStmt;
Eu recebo um erro:Unknown column 'useridKey' in 'field list'
violino