1

我对 SQL 很陌生,正在为汽车经销商创建一个基本数据库。我有一张“年份”表,我需要保存一系列年份(1950 - 2014)。

代替

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

等等等等……

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

4

2 回答 2

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演示

于 2013-09-29T01:07:25.283 回答
2

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

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

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

for ($i = 1950; $i <= 2014; $i++){
    mysqli->query("INSERT INTO 'Years' ('year') (".$i.")");
}
于 2013-09-29T00:39:44.463 回答