2

私が行っている小さなプロジェクトのヒントと指針を探しています。いくつかのアイデアがありますが、それらがベストプラクティスであるかどうかはわかりません。私はmysqlとphpを使用しています。

データベースに nomsing というテーブルがあります。

整数である行IDと呼ばれる主キーがあります。

次に、このテーブルを参照する他のテーブルが約 8 つあります。これは、nomplu、accsing、accplu、datsing、datplu などと呼ばれます。それぞれに、命名の主キーを参照する列があります。

私のphpコードを使用すると、テーブルに挿入するすべての情報が得られます.1つを除いて、nomsingテーブルの行IDプライマリキーです。そのため、php は次のような一連の挿入を生成します。

INSERT INTO nomsing(word,postress,gender) VALUES (''велосипед","8","mask").
INSERT INTO nomplu(word,postress,NOMSING?REFERENCE) VALUES (''велосипеды","2",@the reference to the id of the first insert@).

さらに挿入がありますが、これは要点を理解しています。2 番目の挿入は、最初の挿入の自動生成 ID を参照する必要があります。私はこれをトランザクションとして機能させたので、すべての挿入が完了するか、まったく挿入されないはずです。

私が持っている1つのアイデアは、IDを自動生成せず、phpで自分で生成することです。そうすれば、トランザクションの前に指定された ID を知ることができますが、ID が既にデータベースにあるかどうかを確認する必要があります。

私が持っている別のアイデアは、最初の挿入を行い、次にその挿入の行 ID を php で照会してから、2 番目の挿入を行うことです。どちらも機能するはずですが、最適なソリューションとは思えません。私はデータベースのトランザクション機能にあまり詳しくありませんが、この場合の最善のアプローチは何でしょうか。挿入してからIDを照会し、残りのクエリを実行するという考えは好きではありません。非常に非効率的であるか、おそらく私が間違っているようです。

4

3 に答える 3

1

マスターテーブルに行を挿入するだけです。次に、挿入 ID ( PDO の場合はlastInserId ) をフェッチし、それを使用して他のクエリを設定できます。

于 2012-09-03T10:03:54.510 に答える
0

'insert_order'(または同様の)と呼ばれる新しい列をnomsingデフォルト値0でテーブルに追加し、挿入ごとに1つのSQLステートメントを生成する代わりに、一括挿入ステートメントを作成できます。

INSERT INTO nomsing(word,postress,gender, insert_order) 
VALUES (''велосипед","8","mask",1), (''abcd'',"9","hat",2).....

insert_orderループ内の1から始まるカウンターを使用して数値を生成します。次にSELECT、テーブルで1つ実行して、IDを取得できます。

SELECT row_id
FROM   nomsing
WHERE  insert_order > 0;

これで、次のクエリに対して一括挿入を実行できるすべてのIDができました。スクリプトの最後で、更新を実行してinsert_order列を0にリセットします。

UPDATE nomsing SET insert_order = 0 WHERE insert_order > 0;

これを行うために列を追加するのは面倒に思えるかもしれませんが、一度に1つのクエリを実行するよりも大幅に速度が向上します。

于 2012-09-03T10:59:04.240 に答える
0

JvdBerg で指定された php バージョン、または Mysql の LAST_INSERT_ID を使用できます。私は通常、前者のオプションを使用します。

ここで同様の SO の質問を参照してください。

于 2012-09-03T10:26:03.657 に答える