Каковы лучшие способы использования INSERT в реляционных таблицах?

StackOverflow https://stackoverflow.com/questions/2017050

Вопрос

Я испытываю свой первый MySQL ВСТАВЛЯТЬ тесты, и я использую эти таблицы:

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_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?
Это было полезно?

Решение

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

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

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

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

Другие советы

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

Учитывая вышесказанное...

Судя по предоставленному вами описанию, агентства и территории относительно статичны.Поэтому их следует настроить до ввода данных о сотруднике.

Затем при вставке сотрудника используйте mysql_insert_id(), чтобы вернуть идентификатор только что созданной записи.(Я предполагаю, что сотрудник_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, если запись не существует.обязательно прочитайте об этом, потому что он работает через уникальные индексы.

ОКРУГ КОЛУМБИЯ

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top