Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
选择LAST_INSERT_ID()在使用触发器时不使用MySQL 5.6.11上的BIGINT_Mysql_Triggers_Last Insert Id - Fatal编程技术网

选择LAST_INSERT_ID()在使用触发器时不使用MySQL 5.6.11上的BIGINT

选择LAST_INSERT_ID()在使用触发器时不使用MySQL 5.6.11上的BIGINT,mysql,triggers,last-insert-id,Mysql,Triggers,Last Insert Id,我在上一篇帖子之后发布了一个新问题“” 在任何情况下,经过进一步调查后,我发现最后一个_INSERT_ID()不起作用,因为我在表上有一个触发器beforeist,这是我遇到的问题 基本上,我的问题是在INSERT语句之后调用最后一个\u INSERT\u ID()时,它返回0,因为我在这个表上有一个BeforeInsert作为触发器。如果我注释掉这个触发器,它工作正常,最后一个\u INSERT\u ID()给出了正确的数字 有没有办法解决这个问题?下面是触发器 DELIMITER $$ U

我在上一篇帖子之后发布了一个新问题“”

在任何情况下,经过进一步调查后,我发现最后一个_INSERT_ID()不起作用,因为我在表上有一个触发器beforeist,这是我遇到的问题

基本上,我的问题是在INSERT语句之后调用最后一个\u INSERT\u ID()时,它返回0,因为我在这个表上有一个BeforeInsert作为触发器。如果我注释掉这个触发器,它工作正常,最后一个\u INSERT\u 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$$

您正在通过假设
信息\u SCHEMA.TABLES.AUTO\u INCREMENT
可以用作
NEW.BookingId
来创建竞争条件。一旦有多个会话同时触发此触发器,就会遇到问题,因为两个会话都会尝试将相同的值分配给BookingId

此外,在BEFORE触发器中审核插入是有风险的,因为插入可能会由于各种原因而失败,然后您可能会得到虚拟审核数据


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

您通过假设
信息\u SCHEMA.TABLES.AUTO\u INCREMENT
可以用作
NEW.BookingId
来创建竞争条件。一旦有多个会话同时触发此触发器,就会遇到问题,因为两个会话都会尝试将相同的值分配给BookingId

此外,在BEFORE触发器中审核插入是有风险的,因为插入可能会由于各种原因而失败,然后您可能会得到虚拟审核数据


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

你能包括你的触发器的定义吗?用触发器更新了我的问题,你为什么这么做?!?为什么不允许MySQL为您设置
AUTO_INCREMENT
字段值,然后随后在同一事务中执行FK插入(使用
LAST_INSERT\u ID()
或类似的API),如果需要的话?或者我也可以将触发器移动到After INSERT事件,我允许MySQL在正常的INSERT语句中设置自动增量值。上面的触发器正在审核添加到表中的任何内容。您可以包含触发器的定义吗?使用触发器更新了我的问题,您为什么要这样做?!?为什么不允许MySQL为您设置
AUTO_INCREMENT
字段值,然后随后在同一事务中执行FK插入(使用
LAST_INSERT\u ID()
或类似的API),如果需要的话?或者我也可以将触发器移动到After INSERT事件,我允许MySQL在正常的INSERT语句中设置自动增量值。上面的触发器正在审核添加到表中的任何内容