用于将一系列年份插入表中的SQL命令

时间:2013-09-29 00:23:08

标签: mysql sql

我是SQL的新手,正在为汽车经销商创建一个基本数据库。我有一个表“年”,我需要保持一定年限(1950年至2014年)。

而不是

INSERT INTO 'Years' ('year') ("1950");
INSERT INTO 'Years' ('year') ("1951");
INSERT INTO 'Years' ('year') ("1952");

等等...

是否有更简单的方法来填充表格?

2 个答案:

答案 0 :(得分:3)

除了为你的应用程序讨论这样一个表的必要性之外,在MySQL方面预先填充表的任务可以通过几种方式解决。

首先,最快的是在一个语句中使用一个数据表(数字)表来执行它,该表可以保存在数据库中或动态生成它,如下例所示

INSERT INTO years (`year`)
SELECT 1950 + q.n - 1
  FROM
(
   SELECT a.N + b.N * 10 + 1 n
     FROM 
    (SELECT 0 AS 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) a
   ,(SELECT 0 AS 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) b
    ORDER BY n
) q 
 WHERE q.n <= 2014 - 1950 + 1

子查询生成一系列从1到100的数字。如果你需要的范围超过100年,那么你可以调整它,或者如果你做了很多这样的查询,那么你可以用持久的计数代替它(数字)表。

这是 SQLFiddle 演示


第二种方法是创建一个使用LOOP并使用预准备语句的存储过程

DELIMITER $$
CREATE PROCEDURE populate_years(IN _start_year INT, IN _end_year INT)
BEGIN
  PREPARE stmt FROM 'INSERT INTO years (year) VALUES(?)';
  SET @y = _start_year;

  START TRANSACTION;
  WHILE @y <= _end_year DO
      EXECUTE stmt USING @y;
      SET @y = @y + 1;
  END WHILE;
  COMMIT;

  DEALLOCATE PREPARE stmt;
END$$
DELIMITER ;

这是 SQLFiddle 演示

答案 1 :(得分:2)

你应该重新考虑你的代码,你永远不需要这样的表......无论你在做什么表,肯定可以在没有它的情况下完成。

如果您仍想创建表,则必须使用循环。

例如,如果您使用的是php:

for ($i = 1950; $i <= 2014; $i++){
    mysqli->query("INSERT INTO 'Years' ('year') (".$i.")");
}