-1

我有一张要填充数据的表格。我正在构建一个查找表,并且我想对将包含的数据进行初始化。查找表将有大约 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 来生成这个列表,但我想知道没有它是否可行。感谢任何提供帮助的人。

4

2 回答 2

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;
于 2013-09-06T13:47:22.110 回答
1

改编自相关问题的优秀答案:

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
于 2013-09-06T14:01:47.910 回答