2010-01-06 3 views
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_employee, table_areas и table_agency, но я не принуждаю чтобы сохранить все данные одновременно, чтобы я мог создать сотрудника, а затем агентство или адрес.

В случае вставки особых данных следует использовать что-то вроде этого или shoud. Я использую непосредственно таблицу 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') 

У меня также есть еще одно сомнение, что я должен делать, если мне нужно связать сотрудника с областью? shoud Я использую другой запрос, поэтому запрос для каждой возможности?

// 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? 

ответ

0

Чтобы связать строки друг друга я создал node_employees, реляционную таблицу. Я использую его для связывания сотрудника с областью или агентством, так что я должен сделать, чтобы связать данные с этой реляционной таблицей?

Это должно быть два стола - один для связи сотрудников с агентствами и отдельный для связи сотрудников с районами. Вы не упомянули ничего, что касается агентств по районам, создавая впечатление, что они независимы друг от друга ...

Независимо от того, что node_employees.employee_id должен быть внешним ключом до EMPLOYEES.employee_id, чтобы гарантировать, что сотрудник уже существует как действительное значение в системе. Аналогично для agency_id между node_employees и agencies таблицами.

Из-за эти отношения, ценности должны существовать в EMPLOYEES и AGENCIES таблицах перед тем они существуют в NODE_EMPLOYEES таблицы. Это делает таблицу NODE_EMPLOYEES в «дочернем» соотношении с двумя другими таблицами, поэтому ваши три оператора INSERT должны будут вставляться родителям перед ребенком и использовать значения от родителей в дочернем элементе.

1

Я предполагаю, что агентства и области являются отношениями друг к другу. другими словами, каждый сотрудник может быть назначен нескольким агентствам и областям. Если нет, я просто добавлю поля agency_id и area_id в таблицу employee и даже не создав таблицу node_employees.

С учетом вышеизложенного ...

Из описания вы предоставили оказываются агентства и районы relativally статичные. Поэтому они должны быть настроены до ввода данных о сотрудниках.

Затем при вставке сотрудника используйте mysql_insert_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 для этого или оператор REPLACE, который ОБНОВЛЯЕТ запись, если она существует, или INSERT, если запись не существует. убедитесь, что вы прочитали его, потому что он работает через уникальные индексы.

DC

Смежные вопросы