powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Добавление во связанные таблицы
8 сообщений из 8, страница 1 из 1
Добавление во связанные таблицы
    #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
Добавление во связанные таблицы
    #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
Добавление во связанные таблицы
    #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
Добавление во связанные таблицы
    #39419479
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Korvin01во второй описаны события, т.е. один и тот же человек может участвовать в 100 событиях.
common (связь внешними ключами по id):
name - событие1
name - событие2
name1 - событие3 и т.д.

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

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

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


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