gpt4 book ai didi

mysql - 使用触发器时,SELECT LAST_INSERT_ID() 在 MySQL 5.6.11 上不使用 BIGINT

转载 作者:行者123 更新时间:2023-11-29 00:28:59 28 4
gpt4 key购买 nike

我在之前的帖子“SELECT LAST_INSERT_ID() Not working with BIGINT on MySQL 5.6.11”之后发布了一个新问题

无论如何,经过进一步调查,我发现 LAST_INSERT_ID() 无法正常工作,因为我在表上有一个触发器 BeforeInsert,我遇到了问题。

所以基本上我的问题是在 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$$

最佳答案

您通过假设 INFORMATION_SCHEMA.TABLES.AUTO_INCREMENT 可以用作 NEW.BookingId 来创建竞争条件。一旦有多个 session 同时触发此触发器,您就会遇到麻烦,因为两个 session 都会尝试为 BookingId 分配相同的值。

此外,审计 BEFORE 触发器中的插入是有风险的,因为插入可能因各种原因而失败,然后您可能会得到幻像的审计数据。

您应该将审核移至 AFTER 触发器中。这样您就知道 INSERT 成功了,并且自动递增的 BookingId 将以传统方式生成。

关于mysql - 使用触发器时,SELECT LAST_INSERT_ID() 在 MySQL 5.6.11 上不使用 BIGINT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17495460/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com