我在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中接收刚刚插入的行?
答案 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',...)