6

一部の列が外部キーの依存関係である複数の MySQL テーブルにデータを挿入するためのベスト プラクティスの方法を探しています。次に例を示します。

Table: contacts
--------------------------------------------------------------------
|  contact_id  |  first_name  | last_name  |  prof_id  |  zip_code  |
--------------------------------------------------------------------

「contacts」テーブルには、単純に auto_increments する PRIMARY KEY (contact_id) と、FOREIGN KEY (prof_id) REFERENCES 「profession」テーブル、FOREIGN KEY (zip_code) REFERENCES 「zip_code」テーブルがあります。これらのテーブルは次のようになります。

Table: profession
----------------------------
|  prof_id  |  profession  |
----------------------------

ここで、'prof_id' は INT NOT NULL AUTO_INCREMENT PRIMARY KEY であり、

Table: zip_code
--------------------------------
|  zip_code  | city  |  state  |
--------------------------------

ここで、「zip_code」は INT(5) NOT NULL PRIMARY KEY です。

レコードを追加したい新しい人がいます。たとえば、次のようにします。

first_name = 'John', last_name = 'Doe', profession = 'Network Administrator', city = 'Sometown', state = 'NY', zip_code = 12345

私がやろうとしていることは次のとおりです。その情報を取得して、適切なテーブルと列に挿入したいと考えています。列内の値の重複を防ぐために (たとえば、職業など)、まず「ネットワーク管理者」のエントリがまだないことを確認し、ある場合はそのキー値を取得したいと思います。挿入してからキー値を取得しないでください。zip_code、city、state についても同じことが言えます。存在する場合はその zip_code キーを使用し、そうでない場合は新しいデータを挿入して関連するキーを取得します。次に、最後に、提供された情報を使用して、新しい連絡先を「連絡先」テーブルに入力します。これには、他のテーブルからの職業と場所に関連付けられた適切なキー値が含まれます。

私の質問は、これを行うための最も推奨される方法は何ですか? ここに座って、特定の職業が存在するかどうかを確認するステートメントを 1 つ記述し、存在しない場合は入力して、キーを取得できることを知っています。zip_code についても同じことを行います。次に、最後にすべてを連絡先に挿入します。ただし、データベースが途中で一時的にオフラインになった場合に問題が発生する可能性があることを考えると、より少ない (おそらく 1 つの) ステートメントでこれを達成するためのより良い方法があるはずです。このすべての。この INSERT で JOIN を使用して、本質的にすべてを正しい場所にカスケードする方法はありますか? これを TRANSACTION 一連のステートメントで処理する必要がありますか?

私は SQL の学習段階にありますが、これまでに使用した本やリソースは、データのテーブルがすべて既に入力されているという前提の下で、ネストされたクエリと JOINS の使用に飛びついたと感じています。これをよりよく学ぶためにグーグルで何をすべきか、またはこのギャップを埋めるのに役立つリソースについての提案も受け付けています。理想的には、これを行うための機能する SQL コードを見たいと思っています。必要に応じて、データベースと対話する言語として PHP を想定しますが、コマンドライン SQL は私が目指していたものです。事前に感謝します。うまくいけば、すべてが明確になりました。

4

1 に答える 1

4

要するに、挿入がアトミックになるように、トランザクションを使用する必要があります (これについては詳細なドキュメント)。これは、すべてのデータが挿入される (またはまったく挿入されない) ことを保証する唯一の方法です。そうしないと、いくつかの挿入後にデータベースが使用できなくなり、他の挿入が完了できないという状況に陥る可能性があります。トランザクションは、実行中の操作が全か無かであることをデータベースに通知するため、何か問題が発生した場合はロールバックする必要があります。

合成主キーを使用している場合、PHP および他の言語は、最後に挿入された ID を取得するためのメカニズムを提供します。完全に MySQL で実行したい場合は、LAST_INSERT_ID()関数を使用できます。次のようなコードになります。

START TRANSACTION;
INSERT INTO foo (auto,text)
    VALUES(NULL,'text');         # generate ID by inserting NULL
INSERT INTO foo2 (id,text)
    VALUES(LAST_INSERT_ID(),'text');  # use ID in second table
COMMIT;
于 2013-08-05T23:01:39.443 に答える