首页 文章

从mysql插入查询中获取新记录主键ID?

提问于
浏览
171

好的,所以我要说我在我的一个表中做了一个mysql INSERT ,该表的列 item_id 设置为 autoincrementprimary key .

How do I get the query to output the value of the newly generated primary key item_id in the same query?

目前我正在运行第二个查询以检索id但这似乎不是一个好的做法,考虑到这可能会产生错误的结果......

如果这是不可能的,那么确保我检索正确ID的最佳做法是什么?

7 回答

  • 13

    您需要使用 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() 返回的值是每个用户,不受其他用户在服务器上运行的其他查询的影响 .

  • 2

    BEWARE !! of "LAST_INSERT_ID()" 如果尝试在PHP中返回此主键值 .

    我知道这个线程没有被标记为php,但是对于任何遇到这个答案的人来说,希望使用标准的mysql_query调用从PHP脚本插件返回一个MySQL插入ID - 它不会工作,并且在没有捕获SQL错误的情况下不明显 .

    较新的mysqli支持多个查询 - 其中 LAST_INSERT_ID() 实际上是来自原始查询的第二个查询 .

    IMO单独的SELECT用于标识最后一个主键比可选的mysql_insert_id()函数更安全,该函数返回从先前的INSERT操作生成的AUTO_INCREMENT ID .

  • 16

    来自 LAST_INSERT_ID() 文档:

    生成的ID基于每个连接在服务器中维护

    也就是说如果你同时对脚本有两个单独的请求,他们就赢了't affect each others' LAST_INSERT_ID() (除非你使用的是持久连接) .

  • 6

    在这里你要找的!!!

    select LAST_INSERT_ID()
    

    这是 SQL Server 中使用的 SCOPE_IDENTITY() 函数的最佳替代方法 .

    您还需要记住,只有在 Insert 查询之后触发了 Last_INSERT_ID() 时,这才有效 . 即查询返回在架构中插入的id . 您无法获取特定表的最后插入ID .

    欲了解更多详情,请浏览链接The equivalent of SQLServer function SCOPE_IDENTITY() in mySQL?

  • 230

    如果在插入行之前需要该值:

    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'
    );
    
  • 14

    您将在查询结果中收到以下参数:

    "fieldCount": 0,
        "affectedRows": 1,
        "insertId": 66,
        "serverStatus": 2,
        "warningCount": 1,
        "message": "",
        "protocol41": true,
        "changedRows": 0
    

    insertId 正是您所需要的 .

    (的NodeJS MySQL的)

  • -2

    只需使用“$ last_id = mysqli_insert_id($ conn);”

相关问题