【问题标题】:MySQL stored procedure skips id's when auto incrementingMySQL存储过程在自动递增时跳过id
【发布时间】:2010-09-25 06:31:40
【问题描述】:

我的存储过程有一些问题。希望任何人都可以帮助我找出问题所在。

我使用来自 week_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');

【问题讨论】:

    标签: mysql auto-increment procedure


    【解决方案1】:

    我称之为“没有问题”。

    您是否意识到根本无法保证您拥有连续的auto_increment 值?实际上,您不能保证下一个auto_incremented 值会大于它之前的值。它有时只是巧合地以这种方式工作。

    auto_increment 可以帮助您生成身份值,仅此而已。

    【讨论】:

    • 嗯,不,我不知道。我只是根据方法名称假设的。阅读dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html 会更清楚。它甚至没有提到任何支持我的假设的东西。谢谢!
    • @theed:嘿,抱歉,我可能不应该那么自信,因为事实上,mysql 人选择的名称“auto_increment”可能会导致错误的假设。例如,MS SQL Server 将这种字段称为“身份”,这使得该字段的用途从一开始就非常清楚。
    猜你喜欢
    • 2015-07-05
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 2020-06-22
    • 2019-06-17
    • 1970-01-01
    • 2011-05-27
    • 2012-11-21
    相关资源
    最近更新 更多