Pergunta

Eu sempre ouço que o uso de "LastInsertId" (ou mysql_insert_id () se você não estiver usando PDO) é mau. Em caso de gatilhos, obviamente é, porque pode devolver algo que não é totalmente o último ID que sua inserção criou.

$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();

Qual é a alternativa?

Foi útil?

Solução

Se você seguir o caminho do Adodb (http://adodb.sourceforge.net/), você pode criar o ID de inserção antecipadamente e explicitamente específico o ID ao inserir. Isso pode ser implementado portavelmente (o ADODB suporta uma tonelada de bancos de dados diferentes ...) e garante que você esteja usando o ID de inserção correto.

O tipo de dados serial do PostGresql é semelhante, exceto que é por mesa/por sequência, você especifica a tabela/sequência que deseja o último ID de inserção ao solicitar.

Outras dicas

IMHO é apenas considerado "mal" porque quase nenhum outro banco de dados SQL (se houver) o possui.

Pessoalmente, acho incrivelmente útil e gostaria de não ter que recorrer a outros métodos mais complicados em outros sistemas.

Uma alternativa é usar sequências, para que você possa gerar o ID antes de fazer a inserção.

Infelizmente, eles não são suportados no MySQL, mas bibliotecas como o Adodb podem imitá -las usando outra tabela. Eu acho que, no entanto, que a emulação em si usará LastInsertId () ou equivalente ... mas pelo menos você tem menos probabilidade de ter um gatilho em uma mesa que é puramente usada para uma sequência

Eu acho que também não é realmente o estado da arte, mas eu uso bloqueios de escrita para garantir que eu realmente recebo o último ID inserido.

Não é sofisticado e não é eficiente, mas se os dados inseridos incluem campos exclusivos, uma seleção pode obviamente produzir o que você procura.

Por exemplo:

INSERT INTO example (column1) VALUES ('test');
SELECT id FROM example WHERE column1 = 'test';

Você poderia tentar o seguinte:

$sql = "SELECT id FROM files ORDER BY id DESC LIMIT 1";
$PS = $DB -> prepare($sql);
$PS -> execute();
$result = $PS -> fetch();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top