将n个有序数字插入表格中

时间:2013-09-06 13:38:44

标签: mysql sql insert

我有一张表要填写数据。我正在构建一个查找表,我想要填充将包含的数据。查找表将具有大约1400行,因此标准多插入看起来似乎不正确。另外,如果可能的话,我想在没有PHP的情况下填充此表这是我的表格形式:

CREATE TABLE score_percentile_lookup (
    id INT(11) NOT NULL AUTO_INCREMENT,
    instance_score INT(11), 
    percentile DECIMAl(5, 2)
    PRIMARY KEY(id)
);

基本上,要开始,实例分数需要是递增列表[0 .. 1400],百分位数可以为空白。 mysql是否支持语法来运行基本上类似于以下内容的插入:

INSERT into score_percentile_lookup (instance_score) VALUES (0), (1), ... (1400);

我可以使用PHP生成此列表,但我想知道它是否可能没有它。感谢任何帮助过的人。

2 个答案:

答案 0 :(得分:1)

MySQL中没有固有的语法。

但是,您可以在存储的程序中使用循环结构:

DELIMITER ;;

CREATE PROCEDURE insert_ints(lbound INT, ubound INT, step INT UNSIGNED) BEGIN
  PREPARE stmt FROM '
    INSERT INTO score_percentile_lookup (instance_score) VALUES (?)
  ';

  SET @acc := lbound;
  WHILE @acc <= ubound DO
    EXECUTE stmt USING @acc;
    SET @acc := @acc + step;
  END WHILE;
  SET @acc := NULL;

  DEALLOCATE PREPARE stmt;
END;;

DELIMITER ;

然后做:

CALL insert_ints(0,1400,1);

或者,如果您已经拥有包含此类数字范围的表格,则可以使用INSERT ... SELECT

INSERT INTO score_percentile_lookup (instance_score)
  SELECT num FROM numbers WHERE num BETWEEN 0 AND 1400;

答案 1 :(得分:1)

改编自related question的优秀答案:

INSERT INTO score_percentile_lookup
(instance_score)
SELECT TOP 1401
(TWO_1.SeqValue + TWO_2.SeqValue + TWO_4.SeqValue + TWO_8.SeqValue + TWO_16.SeqValue + TWO_32.SeqValue + TWO_64.SeqValue + TWO_128.SeqValue + TWO_256.SeqValue + TWO_512.SeqValue + TWO_1024.SeqValue) SeqValue
FROM
(SELECT 0 SeqValue UNION ALL SELECT 1 SeqValue) TWO_1
CROSS JOIN (SELECT 0 SeqValue UNION ALL SELECT 2 SeqValue) TWO_2
CROSS JOIN (SELECT 0 SeqValue UNION ALL SELECT 4 SeqValue) TWO_4
CROSS JOIN (SELECT 0 SeqValue UNION ALL SELECT 8 SeqValue) TWO_8
CROSS JOIN (SELECT 0 SeqValue UNION ALL SELECT 16 SeqValue) TWO_16
CROSS JOIN (SELECT 0 SeqValue UNION ALL SELECT 32 SeqValue) TWO_32
CROSS JOIN (SELECT 0 SeqValue UNION ALL SELECT 64 SeqValue) TWO_64
CROSS JOIN (SELECT 0 SeqValue UNION ALL SELECT 128 SeqValue) TWO_128
CROSS JOIN (SELECT 0 SeqValue UNION ALL SELECT 256 SeqValue) TWO_256
CROSS JOIN (SELECT 0 SeqValue UNION ALL SELECT 512 SeqValue) TWO_512
CROSS JOIN (SELECT 0 SeqValue UNION ALL SELECT 1024 SeqValue) TWO_1024
ORDER BY SeqValue