Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Добавление во связанные таблицы / 8 сообщений из 8, страница 1 из 1
14.03.2017, 19:16
    #39419247
Korvin01
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление во связанные таблицы
Всем привет!
Нужно сделать перенос данных из таблицы во связанные таблицы (в рамках одной базы данных).

MySQL (InnoDB):

Есть 4 таблицы:
tmp: которая содержит все данные. Из нее нужно перенести в связанные таблицы (многие-ко многим)

1. Таблица содержит данные с уникальным полем.
2. Связующая таблица.
3. Во всех таблицах, кроме связующей (AI)

Код: sql
1.
2.
3.
4.
5.
INSERT IGNORE INTO table1 (name1(уникальное_поле), name2, name3, name4, name5) SELECT n1, n2, n3, n4, n5  from tmp;
SET @id_un1 = last_insert_id();
INSERT INTO table2 (r_name1, r_name2, r_name3, r_name4) SELECT r_1, r_2, r_3, r_4  from tmp;
SET @id_un2 = last_insert_id();
INSERT INTO common (un_1, un_2) VALUES (@un_1, @un_2);



Данные добавляет, но в связующую таблицу приходит только 1 значение. Понимаю, что это основы, но хотя бы направление подскажите!
...
Рейтинг: 0 / 0
14.03.2017, 19:36
    #39419269
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление во связанные таблицы
last_insert_id() возвращает последнее сгенерированное значение. ОДНО. Если вставлено несколько записей одним запросом - вернётся первое из всех сгенерированных для этого запроса.

Korvin01в связующую таблицу приходит только 1 значение
INSERT ... VALUES вставляет ровно столько записей, сколько блоков в секции VALUES. У тебя там один блок - вставится одна запись.

Правильный третий запрос такой:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
INSERT INTO common (un_1, un_2)
SELECT table1.id, table2.id
FROM tmp, table1, table2
WHERE table1.name1 = tmp.n1 
  AND table1.name2 = tmp.n2
  AND table1.name3 = tmp.n3
  AND table1.name4 = tmp.n4
  AND table1.name5 = tmp.n5
  AND table2.r_name1 = tmp.r_1
  AND table2.r_name2 = tmp.r_2
  AND table2.r_name3 = tmp.r_3
  AND table2.r_name4 = tmp.r_4


При этом совокупности (name1, name2, name3, name4, name5) и (r_name1, r_name2, r_name3, r_name4) в пределах своей таблицы каждая должны быть уникальными.
...
Рейтинг: 0 / 0
15.03.2017, 09:17
    #39419475
Korvin01
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление во связанные таблицы
Akina, Спасибо за ответ. Решение работает. Но только, как и писал с уникальными колонками.

У меня есть таблица tmp:
n1, n2, n3, n4, n5, r_1, r_2, r_3, r_4 (49к записей)
из нее я переношу данные в 3 таблицы:
table1 - перенеслось правильно (1,3к записей)
table2 - перенеслось правильно (49к записей)
common - пришло 1,3к записей (в связующую таблицу)

Но связующую таблицу пришлось делать именно из-за того, что table1 есть уникальная колонка имя. А во второй описаны события, т.е. один и тот же человек может участвовать в 100 событиях.
common (связь внешними ключами по id):
name - событие1
name - событие2
name1 - событие3 и т.д.

Вот как правильно это перенести?
...
Рейтинг: 0 / 0
15.03.2017, 09:26
    #39419479
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление во связанные таблицы
Korvin01во второй описаны события, т.е. один и тот же человек может участвовать в 100 событиях.
common (связь внешними ключами по id):
name - событие1
name - событие2
name1 - событие3 и т.д.

Вот как правильно это перенести?
Правильно - переделать структуру. Предварительно почитав теорию по организации структуры БД для представления связи много-ко-много.
...
Рейтинг: 0 / 0
15.03.2017, 09:44
    #39419491
Korvin01
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление во связанные таблицы
Akina,
таблицы:
empl:
id, employee_name, position и т.д.
events:
id, event_date, event_place и т.д.

Работник такой один, но переговоров, например за историю работы у него может быть 100. Поэтому из прочитанного сделал вывод, что связующая таблица будет выходом, плюс, таблиц, конечно больше. Иначе, как узнать, что на этих переговорах был именно этот сотрудник или посмотреть историю переговоров сотрудника? Понимаю, что можно все это засунуть в 1 таблицу, как сейчас, но если сотрудников больше 10к? А переговоров 1млн?

Может я просто не с той стороны подхожу к вопросу?
...
Рейтинг: 0 / 0
15.03.2017, 10:29
    #39419548
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление во связанные таблицы
Как последнее пояснение соотносится с денормализованной таблицей событий?
...
Рейтинг: 0 / 0
15.03.2017, 11:13
    #39419626
Korvin01
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление во связанные таблицы
Akina,
Согласен, чтобы получать правильные ответы - нужно задавать правильные вопросы.

В изображении структура бд.
В таблице tmp строкой перечислены сотрудники и события. (в данный момент записей 49к)
(id, Иванов Иван Иванович, менеджер, статус, 12-10-2016, Смоленск, договор 1020),
(id, Иванов Иван Иванович, менеджер, статус, 11-10-2016, Смоленск, договор 1021)
(id, Иванов Иван Иванович, менеджер, статус, 13-10-2016, Смоленск, договор 1020)

Нужно перенести из это таблицы в emp (сотрудников 1,3к):
(id, Иванов Иван Иванович, менеджер, статус)
(id, Петров Петр Петрович, менеджер, статус)
Имя сотрудника уникально.

Далее в event (так же 49к записей):
(12-10-2016, Смоленск, договор 1020)
(11-10-2016, Смоленск, договор 1021)

А в связующей указать их id
id_emp id_event
1 3
2 4

Спасибо за терпение:)
...
Рейтинг: 0 / 0
15.03.2017, 11:18
    #39419635
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление во связанные таблицы
В исходной таблице есть уникальное поле. Предлагаю временно в структуру итоговых таблиц добавить такое же поле (ну только не как ключевое, а просто как индексированное и допускающее NULL). Делать перенос данных в них вместе с этим полем. А при заполнении связующей таблицы устанавливать связь не по равенству кучи содержательных полей, а по этому самому дополнительному полю. Ну и по завершении процесса из целевых таблиц это поле удалить за ненадобностью.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Добавление во связанные таблицы / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]