Mysql 触发器不会将last_insert_id() 传递给连接

标签 mysql

这是我的架构:

我试图在“台式机”或“笔记本电脑”中插入一个从“计算机”自动生成的 ID。这有效。

我的问题是当我插入任一表时,我无法选择last_insert_id();

我是不是做错了什么?我正在尝试将 id 一直传递到我的应用程序,以进行进一步处理。选择 MAX(id) 不是有效的解决方案。我的 SQL 连接创建一个插入语句,并且触发器不应破坏该功能...

Use test;

CREATE TABLE `laptops` (
  `id` int(11) NOT NULL,
  `name` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=innodb DEFAULT CHARSET=utf8;

CREATE TABLE `desktops` (
  `id` int(11) NOT NULL,
  `name` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`),
) ENGINE=innodb DEFAULT CHARSET=utf8;

CREATE TABLE `computers` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `type` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=innodb DEFAULT CHARSET=utf8;

CREATE TRIGGER `laptops_BINS` BEFORE INSERT ON `laptops` FOR EACH ROW
BEGIN
  IF (EXISTS(SELECT id FROM laptops WHERE name = NEW.name)) THEN
    SET NEW.id = NULL;
  ELSE
    INSERT INTO computers (type) VALUES ('laptop');
    SET NEW.id = LAST_INSERT_ID();
    SET NEW.id = LAST_INSERT_ID(NEW.id);
  END IF;
END

CREATE TRIGGER `desktop_BINS` BEFORE INSERT ON `desktops` FOR EACH ROW
BEGIN
  IF (EXISTS(SELECT id FROM desktops WHERE name = NEW.name)) THEN
    SET NEW.id = NULL;
  ELSE
    INSERT INTO computers (type) VALUES ('desktop');
    SET NEW.id = LAST_INSERT_ID();
    SET NEW.id = LAST_INSERT_ID(NEW.id);
  END IF;
END

INSERT INTO laptops (name) VALUES ('laptop1');
INSERT INTO laptops (desktop) VALUES ('desktop1');
INSERT INTO laptops (name) VALUES ('laptop2');
INSERT INTO laptops (desktop) VALUES ('desktop2');

SELECT last_insert_id();

期望是 4,实际上是 0。

关于如何修复触发器有什么想法吗?也许有人可以帮我格式化 AFTER_INSERT 语句来修复last_insert_id?

我尝试将值设置为自动递增,并且在笔记本电脑和台式机表中是唯一的,但这都无法解决问题。

最佳答案

而不是试图处理“last_insert_id”的“困惑”。我决定将表结构更改为更“常见”的格式。 即将“笔记本电脑”和“台式机”表更改为具有“auto_increment”键。这会将“computers”表更改为具有主键“computer_id”(来自“laptops”或“desktops”)和“computer_type”。

这是表结构和触发器。

已经在windows xp上的mysql 5.5.16上测试过。

CREATE TABLE `laptops` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

CREATE TABLE `desktops` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

CREATE TABLE `computers` (
  `computer_id` int(11) NOT NULL,
  `computer_type` varchar(45) NOT NULL,
  PRIMARY KEY (`computer_id`,`computer_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DELIMITER $$
USE `testmysql`$$
DROP TRIGGER /*!50032 IF EXISTS */ `laptop_bins`$$

CREATE
    /*!50017 DEFINER = 'test'@'localhost' */
    TRIGGER `laptop_bins` AFTER INSERT ON `laptops` 
    FOR EACH ROW BEGIN
      INSERT INTO computers (computer_id, computer_type ) VALUES (new.id, 'laptop');
    END;
$$
DELIMITER ;

DELIMITER $$
USE `testmysql`$$
DROP TRIGGER /*!50032 IF EXISTS */ `desktop_bins`$$

CREATE
    /*!50017 DEFINER = 'test'@'localhost' */
    TRIGGER `desktop_bins` AFTER INSERT ON `desktops` 
    FOR EACH ROW BEGIN
      INSERT INTO computers (computer_id, computer_type ) VALUES (new.id, 'desktop');
    END;
$$
DELIMITER ;

示例查询和输出:

INSERT INTO laptops (NAME) VALUES ('laptop1');
INSERT INTO desktops (NAME) VALUES ('desktop1');
INSERT INTO laptops (NAME) VALUES ('laptop2');
INSERT INTO desktops (NAME) VALUES ('desktop2');

Laptops: 
    id  name     
------  ---------
     1  laptop1  
     2  laptop2  

Desktops:
    id  name      
------  ----------
     1  desktop1  
     2  desktop2  

Computers:
computer_id  computer_type  
-----------  ---------------
          1  desktop        
          1  laptop         
          2  desktop        
          2  laptop         

关于Mysql 触发器不会将last_insert_id() 传递给连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22344711/

相关文章:

php - 无法在存储过程 phpmyadmin 中声明变量 | mysql

当在 where 子句中使用 sleep() 时,MySql 查询花费的时间太长

php - 在 Mac 上设置 Laravel php artisan migrate 错误 : No such file or directory

php - 如何将变量内容输入到数据库中而不是 <?php echo $variable; ?>

mysql - 选择所有列,同时对一列执行 ifnull

mysql - 如何使用 CodeIgniter 将 NULL 插入数据库?

php - 在 PHP 中插入数据库

具有相同列名的 PHP MySQL 内部连接

php - 数据库查询(MySQL 与 PHP)未显示在 DOM 中

mysql:更新通过从同一个表中进行选择而找到的行抛出错误