MySQL存储过程在自动递增时跳过id

时间:2010-09-25 06:31:40

标签: mysql auto-increment procedure

我的存储过程遇到了一些问题。希望有人能帮助我找出问题所在。

我使用weekly_schedule中的数据作为填充我的航班表的模板。我通过调用CreateFlights()来做到这一点。所有数据都按预期插入,所以我没有遗漏任何数据,但由于某种原因,尽管我在flight.id上使用了auto_increment,但每次跳过第三行。 (flight.id = 1,2,4,5,7,8,10,11 ... 472,473,475,476 ...
flight.id = 3,6,9,12等不是空的,它们根本就不存在。)

我无法弄清楚为什么我会在id序列中找到漏洞。谁能帮我理解会发生什么?我希望飞行标识连续不断。

这是我的代码..


CREATE PROCEDURE CreateFlights()
BEGIN
  DECLARE startdate date DEFAULT curdate();
  DECLARE enddate date DEFAULT date_add(startdate, interval 367 day);

 WHILE startdate <= enddate DO
 INSERT INTO flight(`id_weekly_flights`, `flightdate`)
  (select `id`, startdate  
   from `weekly_flights`
   WHERE `name_weekdays` = dayname(startdate)
   AND `fl_year` = year(startdate));
 SET startdate = date_add(startdate, interval 1 day);
 END WHILE;
END //

CREATE TABLE weekly_flights (  
id int NOT NULL AUTO_INCREMENT,  
departuretime time,  
fl_year int,  
name_weekdays varchar(9),  
id_route varchar(8),  
PRIMARY KEY (id),  
FOREIGN KEY (name_weekdays) REFERENCES weekdays(name),  
FOREIGN KEY (id_route) REFERENCES route(id)  
)  
ENGINE=INNODB;

CREATE TABLE flight (  
id int NOT NULL AUTO_INCREMENT,  
flightdate date DEFAULT NULL,   
id_weekly_flights int,  
PRIMARY KEY (id),  
FOREIGN KEY (id_weekly_flights) REFERENCES weekly_flights(id)  
)  
ENGINE=INNODB;

INSERT INTO weekly_flights(departuretime, fl_year, name_weekdays, id_route)  
VALUES  
(073000,2010,'Monday', 'LIN2STH'),  
(073000,2010,'Monday', 'STH2LIN'),  
(073000,2010,'Friday', 'LIN2STH'),  
(073000,2010,'Friday', 'STH2LIN'),  
(210000,2010,'Sunday', 'LIN2STH'),  
(210000,2010,'Sunday', 'STH2LIN'),  
(073100,2011,'Monday', 'LIN2STH'),  
(073100,2011,'Monday', 'STH2LIN'),  
(073100,2011,'Friday', 'LIN2STH'),  
(073100,2011,'Friday', 'STH2LIN'),  
(093100,2011,'Sunday', 'LIN2STH'),  
(093100,2011,'Sunday', 'STH2LIN');

1 个答案:

答案 0 :(得分:3)

我称之为“无问题”。

您是否意识到这一事实,您无法保证连续auto_increment个值?实际上,您无法保证下一个auto_increment ed值将大于之前的auto_increment ed值。它只是巧合地以这种方式工作。

{{1}}可以帮助您生成身份值,这就是它的全部内容。