6

「lastInsertId」(または PDO を使用していない場合は mysql_insert_id()) を使用するのは悪いことだとよく耳にします。トリガーの場合は、INSERT が作成した最後の 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();

代替手段は何ですか?

4

6 に答える 6

4

私見は、他のSQLデータベース(存在する場合)がほとんどないため、「悪」と見なされるだけです。

個人的には非常に便利で、他のシステムでより複雑な方法に頼らなくてもよかったと思っています。

于 2008-11-14T13:08:49.717 に答える
3

1 つの代替方法は、代わりにシーケンスを使用することです。そのため、挿入を行う前に自分で ID を生成します。

残念ながら、これらは MySQL ではサポートされていませんが、Adodb などのライブラリは別のテーブルを使用してそれらをエミュレートできます。ただし、エミュレーション自体は lastInsertId() または同等のものを使用すると思いますが、少なくとも、純粋にシーケンスに使用されるテーブルでトリガーを使用する可能性は低くなります

于 2008-11-14T13:42:58.493 に答える
2

ADOdb ( http://adodb.sourceforge.net/ )のルートに進む場合は、事前に挿入 ID を作成し、挿入時に ID を明示的に指定できます。これは移植可能に実装でき (ADOdb は多数の異なるデータベースをサポートしています...)、正しい挿入 ID を使用していることを保証します。

PostgreSQL SERIAL データ型は、テーブルごと/シーケンスごとであることを除いて似ています。リクエスト時に、最後の挿入 ID が必要なテーブル/シーケンスを指定します。

于 2008-11-14T13:41:49.463 に答える
1

それも最先端ではないと思いますが、書き込みロックを使用して、最後に挿入された ID を確実に取得できるようにしています。

于 2008-11-14T12:31:49.823 に答える
0

洗練されておらず、効率的ではありませんが、挿入したデータに一意のフィールドが含まれている場合、SELECT は明らかに目的を達成できます。

例えば:

INSERT INTO example (column1) VALUES ('test');
SELECT id FROM example WHERE column1 = 'test';
于 2008-11-14T12:28:33.277 に答える
-3

これを試すことができます:

$sql = "SELECT id FROM files ORDER BY id DESC LIMIT 1";
$PS = $DB -> prepare($sql);
$PS -> execute();
$result = $PS -> fetch();
于 2012-07-17T12:50:20.290 に答える