mysql - 将一系列年份插入表中的 SQL 命令

标签 mysql sql

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

代替

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

等等等等......

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

最佳答案

除了讨论这样一个表对您的应用程序的必要性之外,在 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 演示

关于mysql - 将一系列年份插入表中的 SQL 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19073132/

相关文章:

php - $_GET Updated_value(?) - 另一个就地编辑器(Jquery 插件)问题

MySQL 无法匹配字符串

sql - 使用 SQL 获取表的 "transpose"

sql - 如何执行 SQL 游标转换

java - MySql相关子查询的实现

mysql - 将数据从一个 MySQL 数据库导入另一个数据库的最有效方法

sql - 如何用 SQL 连接 2 个以上的字段?

php - PHP 数组的 Foreach 循环问题

php - httpd、myslqd 和 SELinux

MySQL子查询或连接不同数据库,其中数据库名称在主查询的结果集中