我在上一篇文章“SELECT LAST_INSERT_ID() Not working with BIGINT on MySQL 5.6.11”
后发布了一个新问题在任何情况下,经过进一步调查后,我发现LAST_INSERT_ID()无法正常工作,因为我在桌面上遇到了一个问题,我遇到了问题。
所以基本上我的问题是在INSERT语句之后调用LAST_INSERT_ID()它返回0,因为我在这个表上有一个BeforeInsert作为触发器。如果我注释掉这个触发器,它工作正常,LAST_INSERT_ID()给我正确的数字。
任何想法如何解决这个问题?以下是触发器
DELIMITER $$
USE `mydb`$$
CREATE
DEFINER=`root`@`%`
TRIGGER `mydb`.`Booking_BINS`
BEFORE INSERT ON `mydb`.`Booking`
FOR EACH ROW
-- Edit trigger body code below this line. Do not edit lines above this one
BEGIN
DECLARE iNextBookingId INT;
SET iNextBookingId = (SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='Booking');
SET NEW.BookingId = iNextBookingId;
INSERT INTO AuditTrail (AuditTrailId,UserId,ActionType,TableName,RowKey,FieldName,OldValue,NewValue,LoggedOn) VALUES
(UUID(),NEW.LastChangedBy,'INSERT','Booking',NEW.BookingId,'HotelId',NULL,NEW.HotelId,NOW()),
(UUID(),NEW.LastChangedBy,'INSERT','Booking',NEW.BookingId,'AgentId',NULL,NEW.AgentId,NOW()),
(UUID(),NEW.LastChangedBy,'INSERT','Booking',NEW.BookingId,'SupplierId',NULL,NEW.SupplierId,NOW());
END$$
答案 0 :(得分:1)
您假设INFORMATION_SCHEMA.TABLES.AUTO_INCREMENT
可以用作NEW.BookingId
,从而创建竞争条件。一旦你有多个会话同时触发此触发器,你就会遇到麻烦,因为两个会话都会尝试为BookingId分配相同的值。
此外,在BEFORE触发器中审核插入是有风险的,因为插入可能由于各种原因而失败,然后您可能会获得幻像审计数据。
您应该将审核移动到AFTER触发器中。这样你知道INSERT成功了,并且自动递增的BookingId将以传统方式生成。