|
Копирование записей сразу трех таблиц.
|
|||
---|---|---|---|
#18+
Все привет. Упрощенно есть три связанных таблицы. Таблица доставок, где указаны код клиента и дата. Подчиненная таблица заказов в каждой доставке, и подчиненная таблица содержимого каждого заказа. Необходимо выбрать все доставки с заказами и содержимым по определенному клиенту и добавить другому клиенту (сделать копию). Сейчас в программе просто во вложенных циклах вычитываю все записи по клиенту и сразу вставляю их с другим кодом клиента. Можно ли это сделать sql-запросами сразу по всем записям? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.06.2020, 21:18 |
|
Копирование записей сразу трех таблиц.
|
|||
---|---|---|---|
#18+
savsoft Можно ли это сделать sql-запросами сразу по всем записям? INSERT может вставлять записи только в ОДНУ таблицу. Так что потребуется три запроса. Которые желательно при этом обернуть в транзакцию, чтобы при проблемах не получить несогласованных данных. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.06.2020, 21:51 |
|
Копирование записей сразу трех таблиц.
|
|||
---|---|---|---|
#18+
Akina savsoft Можно ли это сделать sql-запросами сразу по всем записям? INSERT может вставлять записи только в ОДНУ таблицу. Так что потребуется три запроса. Которые желательно при этом обернуть в транзакцию, чтобы при проблемах не получить несогласованных данных. Это понятно, мне не понятно, как быть с автоинкрементными полями, как вообще это можно сделать? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.06.2020, 22:12 |
|
Копирование записей сразу трех таблиц.
|
|||
---|---|---|---|
#18+
[quot savsoft#22152010] Akina Это понятно, мне не понятно, как быть с автоинкрементными полями, как вообще это можно сделать? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.06.2020, 22:49 |
|
Копирование записей сразу трех таблиц.
|
|||
---|---|---|---|
#18+
[quot Gluck99#22152034] savsoft пропущено... Я так понимаю, проблема в копировании структуры, связки автоинкрементных полей? На самом деле - это домашнее задание на курсах. Оно состоит из трех подчиненных таблиц, главная таблица, в которой указывается клиент, дата; подчиненная таблица блоков ДЗ и подчиненная таблица собственно материалов. ДЗ может быть или у студента (индивидуальные занятия) или у группы. Бывает студент из группы переходит на индивидуальные занятия, и преподавателю нужно знать, какие у него были ДЗ. Сответственно нужно скопировать все записи, которые относились к группе, заменив код клиента, точнее пары, тип и код. Сейчас я это тупо на php делаю. Выбираю все ДЗ группы, в цикле иду по записям, для каждой записи вставляю новую запись с новым кодом клиента, читаю новый id, выбираю все блоки ДЗ, иду по блокам и добавляю блоки ДЗ новому клиенту, беру новый id блока, иду по содержимому блока, вставляю содержимое с новым id. И так перебираю все содержимое каждого блока каждого ДЗ. Делаю кучу инсертов, проблем нет, но есть мысль, можно ли это как-то сделать попроще. Пока только додумался, после получения id только что вставленного блока, копировать все содержимое одним запросом. Типа INSERT INTO содержимое_блока (новый id, поля) SELECT FROM содержимое_блока old где id блока равно старому id. Не знаю, можно ли это еще как упростить? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.06.2020, 23:10 |
|
Копирование записей сразу трех таблиц.
|
|||
---|---|---|---|
#18+
Принципиально упростить алгоритм нельзя, можно вынести на сервер в хранимую процедуру, а из php дёргать её с параметром, тогда код на клиенте схлопнется до нескольких строчек. Просто набором insert'ов тут ничего не сделать. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.06.2020, 23:26 |
|
Копирование записей сразу трех таблиц.
|
|||
---|---|---|---|
#18+
Gluck99 Принципиально упростить алгоритм нельзя, можно вынести на сервер в хранимую процедуру, а из php дёргать её с параметром, тогда код на клиенте схлопнется до нескольких строчек. Просто набором insert'ов тут ничего не сделать. Ясно, спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.06.2020, 23:30 |
|
Копирование записей сразу трех таблиц.
|
|||
---|---|---|---|
#18+
savsoft как быть с автоинкрементными полями, как вообще это можно сделать? Представь, что в таблице dostavka есть две записи с разными dst_id и полностью совпадающими остальными полями. Теперь представь, что мы пакетно, одним запросом, скопировали эти записи в новую таблицу, где они получили новые dst_id. А вот теперь скажи - как установить соответствие между этими записями, как установить, что запись вот с этим dst_id из старой таблицы соответствует записи вон с именно тем dst_id в новой? а вот никак. Следовательно, задачу решит только копирование по одной записи - с получением нового dst_id для одной записи, обработка для этой записи всей зависимой цепочки, и только потом копирование другой записи. То есть мы получаем итерационное решение - а SQL-запросы, увы, так не делают. Для решения задачи в структуре каждой таблицы, имеющей хотя бы одну зависимую таблицу, должен существовать натуральный уникальный ключ. Даже если он не оформлен как индекс. Или трахайся с циклами - на стороне клиента, как ты делаешь сейчас, или на стороне сервера, как предлагает Gluck99 . Последнее, кстати, намного разумнее. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2020, 07:59 |
|
Копирование записей сразу трех таблиц.
|
|||
---|---|---|---|
#18+
Akina savsoft как быть с автоинкрементными полями, как вообще это можно сделать? Представь, что в таблице dostavka есть две записи с разными dst_id и полностью совпадающими остальными полями. Теперь представь, что мы пакетно, одним запросом, скопировали эти записи в новую таблицу, где они получили новые dst_id. А вот теперь скажи - как установить соответствие между этими записями, как установить, что запись вот с этим dst_id из старой таблицы соответствует записи вон с именно тем dst_id в новой? а вот никак. Следовательно, задачу решит только копирование по одной записи - с получением нового dst_id для одной записи, обработка для этой записи всей зависимой цепочки, и только потом копирование другой записи. То есть мы получаем итерационное решение - а SQL-запросы, увы, так не делают. Для решения задачи в структуре каждой таблицы, имеющей хотя бы одну зависимую таблицу, должен существовать натуральный уникальный ключ. Даже если он не оформлен как индекс. В принципе он есть. Это тип клиента + код клиента + дата. Но тогда нужно их копировать в подчиненные таблицы, чтобы избавиться от автоинкриментных ключей? И таблицы одни, нет старых и новых. Нужно продублировать наборы записей одного клиента для другого. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2020, 11:14 |
|
Копирование записей сразу трех таблиц.
|
|||
---|---|---|---|
#18+
savsoft В принципе он есть. Это тип клиента + код клиента + дата. Но тогда нужно их копировать в подчиненные таблицы, чтобы избавиться от автоинкриментных ключей? savsoft И таблицы одни, нет старых и новых. Нужно продублировать наборы записей одного клиента для другого. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2020, 11:19 |
|
Копирование записей сразу трех таблиц.
|
|||
---|---|---|---|
#18+
Akina savsoft В принципе он есть. Это тип клиента + код клиента + дата. Но тогда нужно их копировать в подчиненные таблицы, чтобы избавиться от автоинкриментных ключей? savsoft И таблицы одни, нет старых и новых. Нужно продублировать наборы записей одного клиента для другого. Ясно, что нужно разбираться. Спасибо, буду учить дальше. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2020, 13:12 |
|
|
start [/forum/moderation_log.php?user_name=eltim]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
62ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
others: | 446ms |
total: | 615ms |
0 / 0 |