我是SQL的新手,正在为汽车经销商创建一个基本数据库。我有一个表“年”,我需要保持一定年限(1950年至2014年)。
而不是
INSERT INTO 'Years' ('year') ("1950");
INSERT INTO 'Years' ('year') ("1951");
INSERT INTO 'Years' ('year') ("1952");
等等...
是否有更简单的方法来填充表格?
答案 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.")");
}