我在 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 中接收刚刚插入的行?
最佳答案
简短的回答是否定的,您所描述的行为没有内置功能。</p>
但是,可以在 BEFORE INSERT 或 AFTER INSERT 触发器中设置用户定义的变量,例如
SET @new_mytable_identifier_val = NEW.identifier ;
插入之后,您可以立即运行单独的查询来检索用户定义变量的当前值:
SELECT @new_mytable_identifier_val
这必须位于触发触发器的同一 session 中(即执行INSERT
的 session )。用户定义的变量在范围内并且在当前 session 中持续存在。请注意,用户定义的变量除了仅在 session 中可用之外,无论如何都不 protected 。 session 中的其他一些语句可能会更改当前分配的值,您需要小心不要“踩踏”触发器分配的值。
您可以使用这样的模式:
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',...)
关于php - 如何在 PHP 中获取 MySQL 表中刚刚插入的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27712838/