Mysql 如果插入发生在触发器中,如何获取最后一个\u INSERT \u ID()?

Mysql 如果插入发生在触发器中,如何获取最后一个\u INSERT \u ID()?,mysql,last-insert-id,Mysql,Last Insert Id,我以为我看到了一些奇怪的行为。插入记录时,LAST\u INSERT\u ID()给我的结果不正确 然后我读了 对于更改值的存储函数和触发器,值为 在函数或触发器结束时恢复,因此下面的语句 不会看到更改的值 是否有其他方法可以在触发器之外获取自动递增的ID -- MySQL Script generated by MySQL Workbench -- 07/08/16 05:58:42 -- Model: New Model Version: 1.0 SET @OLD_UNIQUE_CHE

我以为我看到了一些奇怪的行为。插入记录时,
LAST\u INSERT\u ID()
给我的结果不正确

然后我读了

对于更改值的存储函数和触发器,值为 在函数或触发器结束时恢复,因此下面的语句 不会看到更改的值

是否有其他方法可以在触发器之外获取自动递增的ID

-- MySQL Script generated by MySQL Workbench
-- 07/08/16 05:58:42
-- Model: New Model    Version: 1.0
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
USE `mydb` ;

-- -----------------------------------------------------
-- Table `mydb`.`a`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`a` (
  `id` INT NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`t`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`t` (
  `a_id` INT NOT NULL,
  `id` INT NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`, `a_id`),
  CONSTRAINT `fk_t1_a1`
    FOREIGN KEY (`a_id`)
    REFERENCES `mydb`.`a` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`inc`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`inc` (
  `a_id` INT NOT NULL,
  `id` INT NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`a_id`, `id`))
ENGINE = MyISAM;


SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
USE `mydb`;

DELIMITER $$
USE `mydb`$$
CREATE TRIGGER `t_BINS` BEFORE INSERT ON `t` FOR EACH ROW
BEGIN 
INSERT INTO inc(a_id) VALUES(NEW.a_id);
SET NEW.id=LAST_INSERT_ID();
END$$


DELIMITER ;
试验


有趣。我能想到的唯一方法(有点笨重)是在表中插入一行,该行的键为上一个LAST_insert_ID,第二列为新的LAST_insert_ID(在触发器结束时重置之前)。至少您可以得到该值,但我希望有更好的方法。我的建议是创建一个tmp_insert_id_表,并在触发器中写入insert查询以在其中插入最后一个_insert_id()。所以你没有任何不匹配。这应该在插入触发器之后。@Kickstart是的,有点笨重:)。顺便说一句,我的理由是由@RakeshKumar描述的,但是你怎么才能找回它呢?查询temp表的内容是什么?例如,如果您想在表a上写一个after insert触发器,那么在tmp表中插入一行,最后一行是insert\u id+table\u name。我能想到的唯一方法(有点笨重)是在表中插入一行,该行的键为上一个LAST_insert_ID,第二列为新的LAST_insert_ID(在触发器结束时重置之前)。至少您可以得到该值,但我希望有更好的方法。我的建议是创建一个tmp_insert_id_表,并在触发器中写入insert查询以在其中插入最后一个_insert_id()。所以你没有任何不匹配。这应该在插入触发器之后。@Kickstart是的,有点笨重:)。顺便说一句,我的理由是由@RakeshKumar描述的,但是你怎么才能找回它呢?查询临时表的内容是什么?例如,如果要在表a上写入插入后触发器,则在tmp表中插入一行,并使用last_insert_id+table_名称
mysql> INSERT INTO a(id) VALUES(1),(2),(3);
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> INSERT INTO t(a_id)VALUES(1);
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO t(a_id)VALUES(1);
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO t(a_id)VALUES(1);
Query OK, 1 row affected (0.00 sec)

mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                5 |
+------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM inc;
+------+----+
| a_id | id |
+------+----+
|    1 |  1 |
|    1 |  2 |
|    1 |  3 |
+------+----+
3 rows in set (0.00 sec)

mysql> SELECT * FROM t;
+------+----+
| a_id | id |
+------+----+
|    1 |  1 |
|    1 |  2 |
|    1 |  3 |
+------+----+
3 rows in set (0.00 sec)

mysql> INSERT INTO t(a_id)VALUES(1);
Query OK, 1 row affected (0.00 sec)

mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                5 |
+------------------+
1 row in set (0.00 sec)

mysql> INSERT INTO t(a_id)VALUES(2);
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO t(a_id)VALUES(2);
Query OK, 1 row affected (0.00 sec)

mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                5 |
+------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM t;
+------+----+
| a_id | id |
+------+----+
|    1 |  1 |
|    1 |  2 |
|    1 |  3 |
|    1 |  4 |
|    2 |  1 |
|    2 |  2 |
+------+----+
6 rows in set (0.00 sec)

mysql> SELECT * FROM inc;
+------+----+
| a_id | id |
+------+----+
|    1 |  1 |
|    1 |  2 |
|    1 |  3 |
|    1 |  4 |
|    2 |  1 |
|    2 |  2 |
+------+----+
6 rows in set (0.00 sec)

mysql> INSERT INTO inc(a_id)VALUES(2);
Query OK, 1 row affected (0.00 sec)

mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                3 |
+------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM inc;
+------+----+
| a_id | id |
+------+----+
|    1 |  1 |
|    1 |  2 |
|    1 |  3 |
|    1 |  4 |
|    2 |  1 |
|    2 |  2 |
|    2 |  3 |
+------+----+
7 rows in set (0.00 sec)

mysql>