0

私は最初の mysql INSERTテストを経験しており、これらのテーブルを使用しています:

table employees
-> employee_id
-> employee_name
-> employee_surname
-> employee_url

table areas
-> area_id
-> area_city
-> area_address
-> area_country

table agencies
-> agency_id
-> agency_name
-> agency_url

table node_employees
-> node_id
-> employee_id
-> area_id
-> agency_id

table_employeetable_areas、およびtable_agencyにデータを保存しますが、すべてのデータを同時に保存する必要はないので、従業員を作成し、続いて代理店または住所を作成できます。

特異なデータ挿入の場合、このようなものを使用する必要がありますか、それともテーブルnode_employeesを直接使用する必要がありますか? はいの場合、どうすればよいですか?

INSERT INTO employees (employee_name, employee_surname, employee_url)
VALUES ('Roger', 'Waters', 'http://pinkfloyd.com')

INSERT INTO agencies (agency_name, agency_url)
VALUES ('Google', 'http://google.com')

INSERT INTO areas (area_city, area_address, area_country)
VALUES ('Rome', 'Via Roma, 123', 'Italy')

行を相互にリンクするために、リレーショナル テーブルnode_employeesを作成しました。従業員を地域や代理店に関連付けるために使用していますが、このリレーショナル テーブルにデータを関連付けるにはどうすればよいでしょうか。

SELECT employee_id FROM employees WHERE employee_name = 'Roger'
SELECT agency_id FROM agencies WHERE agency_name = 'Google'

// I'll get their ids in php
$php_employee_id
$php_agency_id

// and then
INSERT INTO node_employees (employee_id, agency_id)
VALUES ('$php_employee_id', '$php_agency_id')

また、別の疑問があります。従業員をエリアに関連付ける必要がある場合はどうすればよいですか? 別のクエリを使用する必要があるため、あらゆる可能性に対するクエリを使用する必要がありますか?

// so, not this
$php_employee_id = 12;
$php_agency_id = 7;
$php_area_id = null;
INSERT INTO node_employees (employee_id, agency_id, area_id)
VALUES ('$php_employee_id', '$php_agency_id', '$php_area_id') // will this remove the previous data with null in area_id?
4

2 に答える 2

1

エージェンシーとエリアは 1 対多の関係であると想定しています。つまり、各従業員を複数の機関や地域に割り当てることができます。そうでない場合は、agent_id フィールドと area_id フィールドを employees テーブルに追加するだけで、node_employees テーブルは作成しません。

以上を踏まえて…

あなたが提供した説明から、機関と地域は比較的静的であるように見えます。そのため、従業員データを入力する前に設定する必要があります。

次に、従業員を挿入するときに mysql_insert_id() を使用して、作成したばかりのレコードの ID を返します。(employee_id は自動インクリメント フィールドであると想定しています)

じゃあ言われた通りにしろよ

SELECT agency_id FROM agencies WHERE agency_name = 'Google'

// I'll get their ids in php
$php_employee_id <== from mysql_insert_id() after inserting employee record
$php_agency_id <== from above agency Select

// and then
INSERT INTO node_employees (employee_id, agency_id)
VALUES ('$php_employee_id', '$php_agency_id')

最後のクエリ

INSERT ステートメントは、既存のレコードを置き換えない新しいレコードを追加します。既存のレコードに「employee_id」などの一意のインデックスがある場合、エラーで失敗します。それを行うには、UPDATE を使用する必要があります。または、レコードが存在する場合はレコードを更新し、レコードが存在しない場合は INSERT を実行する REPLACE ステートメントを使用する必要があります。一意のインデックスを介して機能するため、必ず読んでください。

DC

于 2010-01-06T23:40:47.017 に答える
0

行を相互にリンクするために、リレーショナル テーブル node_employees を作成しました。従業員を地域や代理店に関連付けるために使用していますが、このリレーショナル テーブルにデータを関連付けるにはどうすればよいでしょうか。

これには 2 つのテーブルが必要です。1 つは従業員を代理店に関連付けるためのもので、もう 1 つは従業員を地域に関連付けるためのものです。エージェンシーとエリアに関することは何も言及されていないため、エージェンシーは互いに独立しているように見えます...

とにかく、従業員がシステム内に有効な値としてすでに存在していることを確認するために、 はnode_employees.employee_idへの外部キーである必要があります。とテーブルの間もEMPLOYEES.employee_id同様です。agency_idnode_employeesagencies

これらの関係のため、値はテーブルに存在するEMPLOYEESにおよびAGENCIESテーブルに存在する必要があります。これにより、テーブルが他の 2 つのテーブルとの "子" 関係になるため、3 つの INSERT ステートメントを子の前に親に挿入し、親の値を子で使用する必要があります。NODE_EMPLOYEESNODE_EMPLOYEES

于 2010-01-06T23:30:47.653 に答える