如何在PHP中获取MySQL表的刚刚插入的行?

时间:2014-12-30 21:29:33

标签: php mysql

我在MySQL中有一个表格,如下所示:

CREATE TABLE IF NOT EXISTS `play` (
  `identifier` varchar(255) NOT NULL DEFAULT '',
    ... ,
  PRIMARY KEY (`identifier`),
  UNIQUE KEY `identifier` (`identifier`)
)

当我在此表中插入一行时,列identifier的值可能会被我写的触发器更改。现在我尝试在PHP中从这个表中插入一行,它完美地工作但我需要检索刚刚插入的行中identifier列的内容。

我知道函数mysql_insert_id()存在,但它只有在表中有一个自动增量的列不能用于我的结构时才有效。

有没有办法在PHP或SQL中接收刚刚插入的行?

1 个答案:

答案 0 :(得分:2)

简短的回答是否定的,您所描述的行为没有内置功能。<​​/ p>

然而,可以在BEFORE INSERT或AFTER INSERT触发器中设置用户定义的变量,例如

SET @new_mytable_identifier_val = NEW.identifier ;

然后,在插入之后,您可以运行单独的查询来检索用户定义变量的当前值:

SELECT @new_mytable_identifier_val

这必须位于激活触发器的相同会话中(即执行INSERT的会话。)用户定义的变量在范围内并且在本届会议。请注意,除了仅在会话中可用之外,用户定义的变量无论如何都不受保护。会话中的其他一些语句可能会更改当前分配的值,您需要注意不要“踩”触发器指定的值。

你可以使用这样的模式:

SET @new_mytable_identifier_val = '';
INSERT INTO mytable (col) VALUES (val);
SELECT @new_mytable_identifier_val;
SET @new_mytable_identifier_val = '';

请注意,使用此方法时,使用多行插入语句,只有最后指定的值可用。 (您也可以使用它,以便触发器将逗号和新标识符值连接到用户定义变量的现有值,这样您就可以返回逗号分隔列表,但这会非常难看。)


作为替代设计,您可以编写一个派生值的函数,而不是在触发器中执行派生/赋值。单独调用该函数,传入需要的值(如果有的话),例如:

SELECT get_mytable_new_identifier('fee','fi','fo') AS newid;

newid
-----
42

然后使用函数返回并在INSERT中使用它

INSERT INTO mytable (identifier,b,c,d,...) VALUES (42,'fee','fi','fo',...)