复制行获取上次插入ID

时间:2018-03-03 18:25:15

标签: php mysql temp-tables last-insert-id

我正在我的数据库中的一个表中复制一行并尝试获取最后插入的ID。复制行工作正常,AI字段正确更新,但它没有返回最后一个插入ID(虽然它确实返回true - 或者如果我在其位置回显其他东西也可以正常工作)。

其他一些查询也使用最后一个插入ID,这些查询效果很好。

我怀疑它与临时表有关,但是在SO上找不到关于上一个插入ID和临时表的类似问题的任何内容。有谁知道导致问题的原因或是否有解决方法?

DECLARE @Delimiter Char(1)

SET @Delimiter = CHAR(9)
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'MyProfile',
@recipients = 'myemailaad@mail.com',
@subject = 'Defects Total Value',
@body='MyText',
@query= 'MyQuery',
@attach_query_result_as_file=1,
@query_result_no_padding=1,
@Query_Result_Header = 1,
@query_attachment_filename = 'Results.xls',
@query_result_separator =@Delimiter

更新

我确定不是理想的解决方案,但是使用此处详述的复制方法可以使用它:How to copy a row and insert in same table with a autoincrement field in MySQL?

1 个答案:

答案 0 :(得分:0)

我认为lastInsertedId将由你的最后一个" DROP TEMPORARY TABLE"更新。言。

尝试将查询拆分为两个单独的查询:

<?php

public function duplicateItinRow($itineraryID) {
    $this->db->query("CREATE TEMPORARY TABLE temporary_itin_table AS SELECT * FROM itinerary_ref WHERE Itinerary_ID = $itineraryID;

    UPDATE temporary_itin_table SET Itinerary_ID=NULL;

    INSERT INTO itinerary_ref SELECT * FROM temporary_itin_table;");


    if(!$this->db->execute()) {
        return false;
    }

    $lastId = $this->db->lastInsertId();
    $this->db->query("DROP TEMPORARY TABLE temporary_itin_table");

    if(!$this->db->execute()) {
        return false;
    }

    return $lastId;
}

另请注意,在不使用预准备语句的情况下将$itineraryID直接添加到SQL查询时,会出现SQL注入漏洞。如果从用户输入中填充$itineraryID,则人们可以破解您的网站。