从MySQL insert查询中获取新的记录主键ID?
假设我正在向我的一个表中插入一个MySQL从MySQL insert查询中获取新的记录主键ID?,mysql,insert,key,auto-increment,Mysql,Insert,Key,Auto Increment,假设我正在向我的一个表中插入一个MySQLINSERT,该表的item\u id列被设置为autoincrement和主键 如何让查询在同一查询中输出新生成的主键项id的值? 目前,我正在运行第二个查询来检索id,但考虑到这可能会产生错误的结果,这似乎不是一个好的做法 如果这是不可能的,那么什么是确保我检索到正确id的最佳实践?您需要使用最后一次插入\u id()功能: 例如: 这将返回插入的最后一行的主键值: 生成的ID在服务器中按每个连接进行维护。这意味着函数返回给给定客户机的值是为影响该客
INSERT
,该表的item\u id
列被设置为autoincrement
和主键
如何让查询在同一查询中输出新生成的主键项id
的值?
目前,我正在运行第二个查询来检索id,但考虑到这可能会产生错误的结果,这似乎不是一个好的做法
如果这是不可能的,那么什么是确保我检索到正确id的最佳实践?您需要使用
最后一次插入\u id()
功能:
例如:
这将返回插入的最后一行的
主键
值:
生成的ID在服务器中按每个连接进行维护。这意味着函数返回给给定客户机的值是为影响该客户机自动增量列的最新语句生成的第一个自动增量值
因此,
LAST\u INSERT\u ID()
返回的值是每个用户的,不受其他用户可能在服务器上运行的其他查询的影响。来自LAST\u INSERT\u ID()
文档:
生成的ID在服务器中按每个连接进行维护
也就是说,如果您同时对脚本有两个单独的请求,它们不会影响彼此的上次插入ID()(除非您使用的是持久连接)。这里是您想要的
select LAST_INSERT_ID()
这是SQL Server中使用的SCOPE\u IDENTITY()
函数的最佳选择
您还需要记住,只有在您的INSERT
查询之后触发Last\u INSERT\u ID()
时,这才有效。
也就是说,查询返回插入到模式中的id。无法获取特定表的上次插入id
有关更多详细信息,请浏览链接当心!!如果试图在PHP中返回此主键值,则返回上次插入ID() 我知道这个线程没有被标记为PHP,但是对于任何遇到这个答案的人来说,如果他们想使用标准的
MySQL\u query
调用从PHP脚本插入返回一个MySQL插入id,那么如果不捕获SQL错误,这个线程将无法工作,也不明显
较新的mysqli
支持多个查询,这实际上是原始查询的第二个查询
在我看来,一个单独的
SELECT
来识别最后一个主键比可选的mysql\u insert\u id()
函数更安全,该函数返回从先前的insert
操作生成的自动增量id
。如果在插入行之前需要该值:
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'
);
您将在查询结果中收到以下参数:
"fieldCount": 0,
"affectedRows": 1,
"insertId": 66,
"serverStatus": 2,
"warningCount": 1,
"message": "",
"protocol41": true,
"changedRows": 0
插入的正是您所需要的
(NodeJS-mySql)只要使用“$last\u id=mysqli\u insert\u id($conn);”如果您使用的是PHP:在对象上,您可以简单地调用
方法,然后插入
否则,使用a可以得到如下值:SELECT LAST_INSERT_ID()
如果在python中使用pymysql
,则可以从游标使用cursor.lastrowid
它是一个DB API标准,也适用于其他Python MySQL实现。我使用了return$this->DB->insert_id()
对于Codeigniter我只想在PHP中分享我的方法,你们中的一些人可能会发现这不是一种有效的方法,但这比其他可用选项要好100
生成一个随机键并将其插入表中,创建新行。
然后可以使用该键检索主键。
使用更新添加数据并执行其他操作
这样做有助于保护行并获得正确的主键
除非您没有任何其他选项,否则我真的不建议这样做。您需要对事务使用最后一个\u INSERT\u ID()函数:
START TRANSACTION;
INSERT INTO dog (name, created_by, updated_by) VALUES ('name', 'migration', 'migration');
SELECT LAST_INSERT_ID();
COMMIT;
此函数将返回表中最后插入的主键。执行以下操作:
$idc = DB::table('tb_clients')->insertGetId([
'ide' => $ide,
'nome' => $nome,
'email' => $email
]);
在$idc上,您将获得最后一个id这样的查询无法返回任何内容;为什么你认为它可能会产生错误的结果?好吧,如果这个过程是由两个人单独执行的,那么你可能会得到一个重叠的过程列表,我认为-因为你必须执行两个单独的查询?可能重复@JimFell是的,这基本上是同一个问题,但这一个在generalUse postgresql中有更好的答案,然后像这样插入表(col1,col2)值(val1,val2)返回id或插入表(col1,col2)值(val1,val2)返回*或更新表集col1=val1,col2=val2,其中语句返回id或更新表集(col1,col2)=(val1,val2)WHERE语句返回id或UPDATE table SET(col1,col2)=(val1,val2)WHERE语句返回*是,但如果在此期间(在流程列表中的查询之间)插入了其他行,该怎么办?有没有办法写入insert查询以便输出它?好的,我明白了…即使查询的最后一个insert id没有记录在结果中,也会记录它…$mysqli->insert_id这会让您返回插入的最后一行的主键
值,因为它是每个连接—每个到服务器的连接都将为此保持自己的价值。我更新了答案以澄清这一点。因此,假设3个用户同时发布他们的表单,我的数据库必须输入他们。我想添加一行,对应于表2中表1的每个新创建的ID。对于传入的数据库写入请求,并发性是否得到了处理,或者我必须在PHP中手动处理?如果在执行table1插入时,数据库知道要插入到tab中的所有信息
$idc = DB::table('tb_clients')->insertGetId([
'ide' => $ide,
'nome' => $nome,
'email' => $email
]);