Domanda

Ho sempre sentito che usando " lastInsertId " (o mysql_insert_id () se non stai usando DOP) è male. In caso di trigger, ovviamente lo è, perché potrebbe restituire qualcosa che non è l'ultimo ID creato dal tuo INSERT.

$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 è l'alternativa?

È stato utile?

Soluzione

Se segui il percorso di ADOdb ( http://adodb.sourceforge.net/ ), quindi è possibile creare prima l'ID di inserimento e specificare esplicitamente l'ID durante l'inserimento. Questo può essere implementato in modo portabile (ADOdb supporta un sacco di database diversi ...) e garantisce che stai usando l'ID di inserimento corretto.

Il tipo di dati SERIAL PostgreSQL è simile, tranne per il fatto che è per tabella / sequenza, si specifica la tabella / sequenza per cui si desidera l'ultimo ID di inserimento quando richiesto.

Altri suggerimenti

IMHO è considerato solo "cattivo" perché quasi nessun altro database SQL (se presente) ce l'ha.

Personalmente lo trovo incredibilmente utile e desidero non dover ricorrere ad altri metodi più complicati su altri sistemi.

Un'alternativa è utilizzare invece le sequenze, quindi si genera l'ID da soli prima di eseguire l'inserimento.

Sfortunatamente non sono supportati in MySQL ma le librerie come Adodb possono emularle usando un'altra tabella. Penso comunque che l'emulazione stessa userà lastInsertId () o equivalente ... ma almeno è meno probabile che tu abbia un trigger su una tabella che è usata puramente per una sequenza

Suppongo che non sia nemmeno all'avanguardia ma uso i blocchi di scrittura per assicurarmi di ottenere davvero l'ultimo ID inserito.

Non è sofisticato e non è efficiente, ma se i dati inseriti includono campi univoci, un SELECT può ovviamente produrre ciò che stai cercando.

Ad esempio:

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

Puoi provare questo:

$sql = "SELECT id FROM files ORDER BY id DESC LIMIT 1";
$PS = $DB -> prepare($sql);
$PS -> execute();
$result = $PS -> fetch();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top