好的,可以说我正在INSERT
对一个表进行mysql操作,并且该表的列item_id
设置为autoincrement
和primary key
。
如何获得查询以item_id
在同一查询中输出新生成的主键的值?
目前,我正在运行第二个查询来检索ID,但是考虑到这可能会产生错误的结果,这似乎不是一种好习惯。
如果这不可能,那么确保我检索正确ID的最佳实践是什么?
好的,可以说我正在INSERT
对一个表进行mysql操作,并且该表的列item_id
设置为autoincrement
和primary key
。
如何获得查询以item_id
在同一查询中输出新生成的主键的值?
目前,我正在运行第二个查询来检索ID,但是考虑到这可能会产生错误的结果,这似乎不是一种好习惯。
如果这不可能,那么确保我检索正确ID的最佳实践是什么?
Answers:
您需要使用以下LAST_INSERT_ID()
函数:http : //dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id
例如:
INSERT INTO table_name (col1, col2,...) VALUES ('val1', 'val2'...);
SELECT LAST_INSERT_ID();
这将让你背PRIMARY KEY
的最后一排的价值你插入:
生成的ID在每个连接的服务器中维护。这意味着函数返回给定客户端的值是为该客户端影响AUTO_INCREMENT列的最新语句生成的第一个AUTO_INCREMENT值。
因此,通过返回的值LAST_INSERT_ID()
是每用户是不会受到影响的,可能在服务器上运行的其他查询其他用户。
PRIMARY KEY
的最后一排的价值,你插入,因为这是每个连接-每个连接到服务器将保持它的这种自身的价值。我已经更新了答案以澄清这一点。
谨防 !! 如果试图在PHP中返回此主键值,则为“ LAST_INSERT_ID()”的值。
我知道此线程未标记为php,但对于遇到此问题的任何人,他们都希望使用标准的mysql_query调用从PHP脚本化插入中返回MySQL插入ID-这将无法工作,并且在没有捕获SQL错误的情况下也不明显。
较新的mysqli支持多个查询 -LAST_INSERT_ID()实际上是原始查询的第二个查询。
与返回从前一个INSERT操作生成的AUTO_INCREMENT ID的可选mysql_insert_id()函数相比,IMO单独的SELECT来标识最后一个主键更为安全。
LAST_INSERT_ID
是每个连接的MySQL函数。如果查询最后一个插入ID,则可能是单独的连接已执行写操作,并且ID错误。
mysql_insert_id()
也适用于每一个连接的基础,但它也受到这里看到奇怪的行为stackoverflow.com/a/897374/1305910由Cliffordlife评论-没关系,我们都应该一直在使用mysqli
在这里您正在寻找!
select LAST_INSERT_ID()
这是SCOPE_IDENTITY()
正在使用的功能的最佳替代方案SQL Server
。
您还需要记住,这只有Last_INSERT_ID()
在您的用户触发后才有效Insert
查询之后。也就是说,查询返回插入到架构中的ID。您无法获取特定表的最后插入的ID。
有关更多详细信息,请通过链接。是否等效于mySQL中SQLServer函数SCOPE_IDENTITY()?
如果在插入行之前需要该值:
CREATE FUNCTION `getAutoincrementalNextVal`(`TableName` VARCHAR(50))
RETURNS BIGINT
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
DECLARE Value BIGINT;
SELECT
AUTO_INCREMENT INTO Value
FROM
information_schema.tables
WHERE
table_name = TableName AND
table_schema = DATABASE();
RETURN Value;
END
您可以在插入内容中使用它:
INSERT INTO
document (Code, Title, Body)
VALUES (
sha1( concat (convert ( now() , char), ' ', getAutoincrementalNextval ('document') ) ),
'Title',
'Body'
);
只需使用“ $ last_id = mysqli_insert_id($ conn);”
如果使用PHP:在PDO对象上,可以在插入后简单地调用 lastInsertId方法。
否则,使用LAST_INSERT_ID可以获得以下值:SELECT LAST_INSERT_ID();
我用过return $this->db->insert_id();
Codeigniter
INSERT
查询中返回任何内容;您为什么认为它可能会产生错误的结果?