문제

나는 항상 "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();

대안은 무엇입니까?

도움이 되었습니까?

해결책

If you go the route of ADOdb (http://adodb.sourceforge.net/), then you can create the insert ID before hand and explicitly specific the ID when inserting. This can be implemented portably (ADOdb supports a ton of different databases...) and guarantees you're using the correct insert ID.

The PostgreSQL SERIAL data type is similar except that it's per-table/per-sequence, you specify the table/sequence you want the last insert ID for when you request it.

다른 팁

IMHO 다른 SQL 데이터베이스 (있는 경우)가 거의 없기 때문에 "악"으로 간주됩니다.

개인적으로 나는 그것이 매우 유용하다고 생각하며, 다른 시스템에서 다른 복잡한 방법에 의지 할 필요가 없기를 바랍니다.

한 가지 대안은 대신 시퀀스를 사용하는 것이므로 인서트를 수행하기 전에 ID를 직접 생성하는 것입니다.

불행히도 그들은 MySQL에서 지원되지 않지만 ADODB와 같은 라이브러리는 다른 테이블을 사용하여 에뮬레이션 할 수 있습니다. 그러나 에뮬레이션 자체가 LastInsertid () 또는 그에 상응하는 것을 사용할 것이라고 생각하지만 적어도 시퀀스에 순전히 사용되는 테이블에 트리거가있을 가능성이 적습니다.

나는 그것이 실제로 예술의 최첨단이 아니라고 생각하지만 마지막 삽입 ID를 실제로 얻을 수 있도록 쓰기 잠금 장치를 사용합니다.

정교하지 않고 효율적이지는 않지만 삽입 한 데이터에 고유 필드가 포함 된 경우 일부는 분명히 귀하가 후에 수행 할 수 있습니다.

예를 들어:

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

당신은 이것을 시도 할 수 있습니다 :

$sql = "SELECT id FROM files ORDER BY id DESC LIMIT 1";
$PS = $DB -> prepare($sql);
$PS -> execute();
$result = $PS -> fetch();
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top