如何遍历值并将它们插入数据库

时间:2014-09-19 19:59:33

标签: mysql sql stored-procedures

如何循环遍历值并将其插入数据库。具体来说,我正在做的是:我有一张桌子,我希望看起来像这样:

years
id  name
1   2015*
2   2014
3   2013
etc etc

(2015年是在这里使用的,因为这个问题是在2014年提出的,我想在今年的第一年开展第一个领域 - 例如 - 如果你在2020年读到这个问题,第一个行应该是2021)。

id字段是auto_incremented,我在搜索了一遍后尝试了这个...

CREATE PROCEDURE `vehicle_years_data()`
BEGIN
    DECLARE i INT DEFAULT YEAR(CURDATE()) + 1;
    WHILE (i >= 1900) DO
        INSERT INTO `vehicle_years` (`name`) VALUE(CONVERT(i, VARCHAR(255));
        SET i = i - 1;
    END WHILE
END$$

DELIMITER ;

CALL `vehicle_years_data()`;

DROP PROCEDURE `vehicle_years_data()`;

但这给了我:

You have an error in your SQL syntax; check the
BEGIN DECLARE i INT DEFAULT YEAR(CUR' at line 10

我知道这样做的静态方法就是

INSERT INTO `vehicle_years` (`name`) VALUES
(2015), (2014), (2013), ...

但这不仅更乏味,而且我无法通过当年加上其中一种动态开始。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

这里有一些问题

  1. varchar不是convert的有效类型。 char
  2. 请勿在名称
  3. 周围的引号中包含括号
  4. 结束后你需要一个半结肠
  5. 代码示例:

    create procedure `vehicle_years_data`()
    begin
        declare i int default year(curdate()) + 1;
        while (i >= 1900) do
            insert into `vehicle_years` (`name`) value (convert(i, char(255)));
            set i = i - 1;
        end while;
    end//
    

    Example SQLFiddle

答案 1 :(得分:1)

以下是基于程序的方法的替代方法:

CREATE OR REPLACE VIEW generator_16
AS SELECT 0 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   UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL
   SELECT 12  UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL 
   SELECT 15;

CREATE OR REPLACE VIEW generator_256
AS SELECT ( ( hi.n << 4 ) | lo.n ) AS n
     FROM generator_16 lo, generator_16 hi;

INSERT INTO `vehicle_years` (`name`)
select  year(curdate()) - n from generator_256