Um bom lugar para começar seria:
SELECT
A.num_1, B.num_2
FROM
Smaller AS A JOIN Smaller AS B ON (A.num_1 < B.num_2)
ORDER BY A.num_1, B.num_2;
Dentro do seu procedimento armazenado, coloque isso em um cursor, itere sobre o cursor e para cada linha faça um INSERT IGNORE. Ou seja:
DECLARE num1,num2 INT;
DECLARE done DEFAULT 0;
DECLARE mycursor CURSOR FOR SELECT # use the select above, im lazy here
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN mycursor;
my_loop: LOOP
FETCH mycursor INTO num1, num2;
IF done THEN
LEAVE my_loop;
END IF;
INSERT IGNORE INTO Smaller VALUES (num1,num2);
END LOOP;
Para responder à sua pergunta atualizada, não tenho certeza se você quer dizer conectado como por meio de relações entre linhas únicas (você precisaria de duas colunas para armazenar essa relação, então seria bastante semelhante). Ou se você quer dizer que tem uma tabela contendo todos os números e outra tabela de duas colunas contendo as relações entre as linhas da primeira tabela.
Ou, finalmente, se você quiser uma tabela contendo apenas strings com "1-2", "1-3" etc. Se for esse o caso, eu manteria como duas colunas individuais e apenas as enviaria como strings usando CONCAT quando você pesquisa a mesa :)