powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Копирование записей сразу трех таблиц.
11 сообщений из 11, страница 1 из 1
Копирование записей сразу трех таблиц.
    #39969951
savsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все привет. Упрощенно есть три связанных таблицы. Таблица доставок, где указаны код клиента и дата. Подчиненная таблица заказов в каждой доставке, и подчиненная таблица содержимого каждого заказа. Необходимо выбрать все доставки с заказами и содержимым по определенному клиенту и добавить другому клиенту (сделать копию). Сейчас в программе просто во вложенных циклах вычитываю все записи по клиенту и сразу вставляю их с другим кодом клиента. Можно ли это сделать sql-запросами сразу по всем записям?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE TABLE dostavka (
  dst_id int NOT NULL AUTO_INCREMENT,
  dst_cli_id int NOT NULL,
  dst_date DATE NOT NULL,  
  PRIMARY KEY (dst_id)
)

CREATE TABLE zakaz (
  zak_id int NOT NULL AUTO_INCREMENT,
  zak_dst_id int NOT NULL,
  zak_box int NOT NULL,
  PRIMARY KEY (zak_id)
)

CREATE TABLE zak_details (
  zkd_id int NOT NULL AUTO_INCREMENT,
  zkd_zak_id int NOT NULL,  
  zkd_tovar_id int NOT NULL,    
  PRIMARY KEY (zkd_id)
)
...
Рейтинг: 0 / 0
Копирование записей сразу трех таблиц.
    #39969960
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
savsoft
Можно ли это сделать sql-запросами сразу по всем записям?
Нет.
INSERT может вставлять записи только в ОДНУ таблицу. Так что потребуется три запроса. Которые желательно при этом обернуть в транзакцию, чтобы при проблемах не получить несогласованных данных.
...
Рейтинг: 0 / 0
Копирование записей сразу трех таблиц.
    #39969967
savsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina
savsoft
Можно ли это сделать sql-запросами сразу по всем записям?
Нет.
INSERT может вставлять записи только в ОДНУ таблицу. Так что потребуется три запроса. Которые желательно при этом обернуть в транзакцию, чтобы при проблемах не получить несогласованных данных.


Это понятно, мне не понятно, как быть с автоинкрементными полями, как вообще это можно сделать?
...
Рейтинг: 0 / 0
Копирование записей сразу трех таблиц.
    #39969972
Gluck99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot savsoft#22152010]
Akina
Это понятно, мне не понятно, как быть с автоинкрементными полями, как вообще это можно сделать?
Я так понимаю, проблема в копировании структуры, связки автоинкрементных полей?
...
Рейтинг: 0 / 0
Копирование записей сразу трех таблиц.
    #39969979
savsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot Gluck99#22152034]
savsoft
пропущено...
Я так понимаю, проблема в копировании структуры, связки автоинкрементных полей?


На самом деле - это домашнее задание на курсах. Оно состоит из трех подчиненных таблиц, главная таблица, в которой указывается клиент, дата; подчиненная таблица блоков ДЗ и подчиненная таблица собственно материалов. ДЗ может быть или у студента (индивидуальные занятия) или у группы. Бывает студент из группы переходит на индивидуальные занятия, и преподавателю нужно знать, какие у него были ДЗ. Сответственно нужно скопировать все записи, которые относились к группе, заменив код клиента, точнее пары, тип и код. Сейчас я это тупо на php делаю. Выбираю все ДЗ группы, в цикле иду по записям, для каждой записи вставляю новую запись с новым кодом клиента, читаю новый id, выбираю все блоки ДЗ, иду по блокам и добавляю блоки ДЗ новому клиенту, беру новый id блока, иду по содержимому блока, вставляю содержимое с новым id. И так перебираю все содержимое каждого блока каждого ДЗ. Делаю кучу инсертов, проблем нет, но есть мысль, можно ли это как-то сделать попроще. Пока только додумался, после получения id только что вставленного блока, копировать все содержимое одним запросом. Типа INSERT INTO содержимое_блока (новый id, поля) SELECT FROM содержимое_блока old где id блока равно старому id. Не знаю, можно ли это еще как упростить?
...
Рейтинг: 0 / 0
Копирование записей сразу трех таблиц.
    #39969980
Gluck99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Принципиально упростить алгоритм нельзя, можно вынести на сервер в хранимую процедуру, а из php дёргать её с параметром, тогда код на клиенте схлопнется до нескольких строчек. Просто набором insert'ов тут ничего не сделать.
...
Рейтинг: 0 / 0
Копирование записей сразу трех таблиц.
    #39969981
savsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gluck99
Принципиально упростить алгоритм нельзя, можно вынести на сервер в хранимую процедуру, а из php дёргать её с параметром, тогда код на клиенте схлопнется до нескольких строчек. Просто набором insert'ов тут ничего не сделать.


Ясно, спасибо.
...
Рейтинг: 0 / 0
Копирование записей сразу трех таблиц.
    #39970025
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
savsoft
как быть с автоинкрементными полями, как вообще это можно сделать?
На ТЕКУЩЕЙ структуре задача нерешаема. Потому что структура - КРИВАЯ.

Представь, что в таблице dostavka есть две записи с разными dst_id и полностью совпадающими остальными полями. Теперь представь, что мы пакетно, одним запросом, скопировали эти записи в новую таблицу, где они получили новые dst_id. А вот теперь скажи - как установить соответствие между этими записями, как установить, что запись вот с этим dst_id из старой таблицы соответствует записи вон с именно тем dst_id в новой? а вот никак. Следовательно, задачу решит только копирование по одной записи - с получением нового dst_id для одной записи, обработка для этой записи всей зависимой цепочки, и только потом копирование другой записи. То есть мы получаем итерационное решение - а SQL-запросы, увы, так не делают.

Для решения задачи в структуре каждой таблицы, имеющей хотя бы одну зависимую таблицу, должен существовать натуральный уникальный ключ. Даже если он не оформлен как индекс.

Или трахайся с циклами - на стороне клиента, как ты делаешь сейчас, или на стороне сервера, как предлагает Gluck99 . Последнее, кстати, намного разумнее.
...
Рейтинг: 0 / 0
Копирование записей сразу трех таблиц.
    #39970083
savsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina
savsoft
как быть с автоинкрементными полями, как вообще это можно сделать?
На ТЕКУЩЕЙ структуре задача нерешаема. Потому что структура - КРИВАЯ.

Представь, что в таблице dostavka есть две записи с разными dst_id и полностью совпадающими остальными полями. Теперь представь, что мы пакетно, одним запросом, скопировали эти записи в новую таблицу, где они получили новые dst_id. А вот теперь скажи - как установить соответствие между этими записями, как установить, что запись вот с этим dst_id из старой таблицы соответствует записи вон с именно тем dst_id в новой? а вот никак. Следовательно, задачу решит только копирование по одной записи - с получением нового dst_id для одной записи, обработка для этой записи всей зависимой цепочки, и только потом копирование другой записи. То есть мы получаем итерационное решение - а SQL-запросы, увы, так не делают.

Для решения задачи в структуре каждой таблицы, имеющей хотя бы одну зависимую таблицу, должен существовать натуральный уникальный ключ. Даже если он не оформлен как индекс.


В принципе он есть. Это тип клиента + код клиента + дата. Но тогда нужно их копировать в подчиненные таблицы, чтобы избавиться от автоинкриментных ключей? И таблицы одни, нет старых и новых. Нужно продублировать наборы записей одного клиента для другого.
...
Рейтинг: 0 / 0
Копирование записей сразу трех таблиц.
    #39970089
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
savsoft
В принципе он есть. Это тип клиента + код клиента + дата. Но тогда нужно их копировать в подчиненные таблицы, чтобы избавиться от автоинкриментных ключей?
Нет. Просто при копировании нужно опираться на именно эту совокупность полей, чтобы получить для неё автоинкрементный ключ новой свежескопированной записи.

savsoft
И таблицы одни, нет старых и новых. Нужно продублировать наборы записей одного клиента для другого.
Это неважно.
...
Рейтинг: 0 / 0
Копирование записей сразу трех таблиц.
    #39970152
savsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina
savsoft
В принципе он есть. Это тип клиента + код клиента + дата. Но тогда нужно их копировать в подчиненные таблицы, чтобы избавиться от автоинкриментных ключей?
Нет. Просто при копировании нужно опираться на именно эту совокупность полей, чтобы получить для неё автоинкрементный ключ новой свежескопированной записи.

savsoft
И таблицы одни, нет старых и новых. Нужно продублировать наборы записей одного клиента для другого.
Это неважно.


Ясно, что нужно разбираться. Спасибо, буду учить дальше.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Копирование записей сразу трех таблиц.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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