代码之家  ›  专栏  ›  技术社区  ›  Marcelo Cantos

替代“pdo::lastinsertid”/“mysql_insert_id”

  •  6
  • Marcelo Cantos  · 技术社区  · 16 年前

    我总是听说使用“lastinsertid”(如果不使用pdo,则使用mysql_insert_id())是邪恶的。在触发器的情况下,它显然是,因为它可能返回完全不是您的插入创建的最后一个ID的内容。

    $DB->exec("INSERT INTO example (column1) VALUES ('test')");
    // Usually returns your newly created ID.
    // However when a TRIGGER inserts into another table with auto-increment:
    // -> Returns newly created ID of trigger's INSERT
    $id = $DB->lastInsertId();
    

    还有什么选择?

    6 回复  |  直到 12 年前
        1
  •  2
  •   Keith Palmer Jr.    16 年前

    如果你走ADODB的路( http://adodb.sourceforge.net/ ,然后可以创建插入ID 手前 并在插入时显式指定ID。这可以移植地实现(ADODB支持大量不同的数据库…)并保证您使用的是正确的插入ID。

    PostgreSQL串行数据类型类似,只是它是每表/每序列的,您可以指定您在请求时希望最后一次插入ID的表/序列。

        2
  •  4
  •   Alnitak    16 年前

    imho它被认为是“邪恶的”,因为几乎没有其他SQL数据库(如果有的话)拥有它。

    就我个人而言,我觉得它非常有用,并且希望我不必在其他系统上使用其他更复杂的方法。

        3
  •  3
  •   Tom Haigh    16 年前

    另一种选择是使用序列,因此在进行插入之前,您自己生成ID。

    不幸的是,MySQL不支持它们,但是像ADODB这样的库可以使用另一个表来模拟它们。不过,我认为仿真本身将使用lastinsertid()或等效的…但至少在一个纯粹用于序列的表上不太可能有触发器

        4
  •  1
  •   markus    16 年前

    我想它也不是最先进的,但我使用写锁来确保我真正获得最后插入的ID。

        5
  •  0
  •   Peter Howe    16 年前

    它不复杂,也不高效,但是如果插入的数据包含唯一的字段,那么选择显然可以生成所需的内容。

    例如:

    INSERT INTO example (column1) VALUES ('test');
    SELECT id FROM example WHERE column1 = 'test';
    
        6
  •  -3
  •   mikeyD    12 年前

    你可以试试这个:

    $sql = "SELECT id FROM files ORDER BY id DESC LIMIT 1";
    $PS = $DB -> prepare($sql);
    $PS -> execute();
    $result = $PS -> fetch();