在MySQL中,我有一个触发器:
BEGIN
   IF (EXISTS(SELECT * FROM devices WHERE device_id = NEW.device_id)) THEN
    SET NEW.id = NULL;
   ELSE
INSERT INTO objects (object_type) VALUES ('3');
SET NEW.id = LAST_INSERT_ID();
   END IF;
END当该触发器(从objects表)获得新的id时,它会将该id插入到设备表的id列中。
当我提到它(例如PHP中的mysql_insert_id(); )时,它是空的。
如何将触发器(LAST_INSERT_ID();)中的插入id作为mysql_insert_id();返回给PHP中的函数?
发布于 2014-03-12 22:11:46
就我个人而言,我使用存储过程。
以下是PDO的基本示例:
用于创建存储过程的代码
CREATE DEFINER=`user`@`localhost` PROCEDURE `InsertUser`(IN `Input_username` INT, OUT `Out_ID` INT)
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN
   INSERT INTO users(
        username)
    VALUES (
    Input_username);
    SET Out_ID = LAST_INSERT_ID();
    SELECT Out_ID;
END和PHP代码
  $insert = "CALL InsertUser(:Input_username,
                             @Out_ID)";
  $bdd = new PDO('mysql:host=localhost;dbname=db-name', 'user', 'password');
  $stmt = $bdd->prepare($insert);     
  $stmt->bindParam(':Input_username', rand(), PDO::PARAM_STR); // to create random name
  $stmt->execute();
  $tabResultat = $stmt->fetch();
  $id_user = $tabResultat['Out_ID'];
  var_dump($id_user);我希望我能帮上忙。:)
发布于 2014-03-15 02:11:27
此行为为by design
如果存储过程执行的语句更改了
LAST_INSERT_ID()的值,则该过程调用后的语句会看到更改后的值。
对于更改该值的存储函数和触发器,该值将在函数或触发器结束时恢复,因此后面的语句将看不到更改的值。
不幸的是,这在您的表和objects之间引入了不一致的风险,因为插入仍然可能发生在这个过程之外(这个问题可以通过对表的复杂的访问限制来解决)
将值保存在用户变量中:
CREATE TRIGGER
....
BEGIN
    INSERT INTO objects (object_type) VALUES ('3');
    SET NEW.id = LAST_INSERT_ID();
    SET @myLastInsertID = LAST_INSERT_ID();
END //
INSERT INTO your_table... -- trigger the above
SELECT @myLastInsertID; -- here is your value只需从object获取值;)
INSERT INTO your_table... -- trigger the above
SELECT MAX(autoinc_column) FROM objects; -- here is your value!变通方法2和3应该封装在事务中,以确保在此过程中没有人会干扰@myLastInsertID或object。
https://stackoverflow.com/questions/22241222
复制相似问题