![]() |
|
Модераторы: skyboy |
![]()
|
|
| korob2001 |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: нет Всего: 61 |
Привет, есть база в которой несколько таблиц. Мне нужно внести данные, полученные из формы сразу в несколько таблиц, т.е. эти данные разбиваются на несколько таблиц. Как лучше сделать такую вставку??? Допустим есть переменная $sql, генерирую запрос:
Или таким образом:
Или может есть ещё какой нить способ??? Вобщем нужен совет. Заранее спасибо, Денис. Это сообщение отредактировал(а) korob2001 - 15.5.2005, 11:13 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||
|
|||||
| Kesh |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2488 Регистрация: 31.7.2002 Где: Германия, Saarbrü cken Репутация: 15 Всего: 54 |
Если возможно, то такие вещи лучше делать одной транзакцией...
-------------------- ![]() |
|||
|
||||
| Mal Hack |
|
||||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 8 Всего: 261 |
MySQL ??? Дык вроде только в 5.
Такой запрос через mysql_query не пройдет. |
||||
|
|||||
| korob2001 |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: нет Всего: 61 |
Как я понимаю, это из-за того, что я соединил все эти запросы один и между ними поставил ';', т.е. получается запрос примерно такого вида:
Так нельзя делать??? Ну собственно ещё вопрос на засыпку. Например когда я делаю запись в файл, мне нужно заблокировать его. Как быть с блокировкой в MySQL??? Это сообщение отредактировал(а) korob2001 - 15.5.2005, 12:45 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||
|
|||||
| Kesh |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2488 Регистрация: 31.7.2002 Где: Германия, Saarbrü cken Репутация: 15 Всего: 54 |
Mal Hack Да нет... транзакции вроде еще и в 4-ке есть... только там нужно хранилище не MyISAM а InnoDB
-------------------- ![]() |
|||
|
||||
| Kurt |
|
|||
|
Увлеченный ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1662 Регистрация: 22.8.2003 Где: Краснодар Репутация: 1 Всего: 36 |
Поясни вопрос. Тебя интересует блокировка таблицы MySQL? Ну, так на время выполнения операций изменения данных (insert, update и т.п.) таблица автоматически блокируется. Можно блокировать вручную. -------------------- Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед) ... Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн) |
|||
|
||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: нет Всего: 61 |
Привет! Вобщем у меня есть 5 таблиц, все таблицы заполняются из одной большой формы, другими словами мне нужно как-то сделать так, что бы записи делались в них синхронно. Что бы не получилось так, что в одну таблицу запись добавится, а в другую нет. Мне нужно связать Id всех этих таблиц и как-то заблокировать их, что бы либо запись добавилась во все таблицы, либо не добавилась ни в одну из них. -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| Kesh |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2488 Регистрация: 31.7.2002 Где: Германия, Saarbrü cken Репутация: 15 Всего: 54 |
korob2001 Это есть транзакция... То есть либо все - либо ничего...
-------------------- ![]() |
|||
|
||||
| Kurt |
|
||||
|
Увлеченный ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1662 Регистрация: 22.8.2003 Где: Краснодар Репутация: 1 Всего: 36 |
Как уже говорилось, транзакции поддерживаются только форматом BDB или InnoDB, для остальных (в том числе и для типа по умолчанию MyISAM) - нет.
korob2001 Если у тебя BDB или InnoDB, можешь сделать так:
Для остальных форматов таблицы можно заблокировать так:
при этом ключевое слово WRITE полностью блокирует таблицу, если поставишь READ - для других юзеров будет разрешено чтение (но не запись!). -------------------- Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед) ... Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн) |
||||
|
|||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 454 |
Интересно, что будет при обвале скрипта посередь выполнения? -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Kurt |
|
|||
|
Увлеченный ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1662 Регистрация: 22.8.2003 Где: Краснодар Репутация: 1 Всего: 36 |
Согласен. Плохо будет. ОЧЕНЬ плохо.
Честно говоря, я никогда вручную не лочил таблицы. Но другого выхода для такого формата таблиц я не знаю. -------------------- Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед) ... Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн) |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 454 |
Стандартный алгоритм... Temporary Tables + Garbage Table Конечно при этом придется мириться с тайм-аутом поступления изменений... Добавлено @ 18:29 Есть еще один выход - таблица резервирования ID-ов. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Kurt |
|
|||
|
Увлеченный ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1662 Регистрация: 22.8.2003 Где: Краснодар Репутация: 1 Всего: 36 |
Поясни, пожалуйста, что ты имеешь ввиду. Ну или ссылку кинь. Буду знать. -------------------- Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед) ... Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн) |
|||
|
||||
| Illuminaty |
|
|||
![]() /*Антон Захаров*/ ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1238 Регистрация: 19.3.2005 Где: Россия, Казань Репутация: 3 Всего: 56 |
||||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 454 |
Kurt
Проблема при добавлении в связанные таблицы при отсутствии транзакций - это а) контроль 100% выполнения всех запросов; б) согласованность резервирования ID-ов. Суть: имеется специальная таблица, в которой для каждой из изменяемых таблиц есть поле соотв. ID-a. При необходимости занесения связных данных выбор ID-ов длЯ каждой из таблиц производится по признаку отсутствия как в самой таблице, так и в таблице резервирования. Когда массив ID-ов сформирован, он записывается в таблицу. Одним запросом. При высокой интенсивности обращений тут же проводится обратный контроль. Все, выделенные ID-ы уже никто не использует, и можно смело приступать к изменениям. Если все изменения прошли нормально - запись зарезервированных ID-ов удаляется. Именно с этого момента сразу все записи становятся доступны к использованию - до этого они считаются недействительными. И клиентская часть при выборках дополнительно контролирует, что ID-ы выбранных записей не фигурируют в таблице резервирования
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| korob2001 |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: нет Всего: 61 |
Конечно важнее, во первых потому, что если спутаются ID хотябы двух записей, весе 5 таблиц накроются, не буду говорить чем, Вобщем как я понял, нужно сделать примерно следующее: Для краткости, приведу пример на 2-х таблицах, ID которых должны строго совпадать:
Теперь мне, как я понял нужно создать ещё одну таблицу, в котой будет резервироваться Id. Ещё я не понял: мне для каждой таблицы нужно создать отдельное поле в резервной таблице ID???
А если в таблице уже есть данные и я попытаюсь перевести её в другой формат, скажем в DBD или InnoDB, данные не будут потеряны или искажены???? Или как создать таблицу с форматом не по умолчанию??? -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||||
|
|||||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 454 |
Погоди... у тебя связь 1:1 по ключевому полю в обеих таблицах??? ты офигел - такое делать, не имея механизма транзакций??? во второй таблице поле ID должно быть неключевым!!! и тогда никакой проблемы целостности просто не существует.
Для контроля в первую таблицу добавляется поле контроля полного занесения, дефолт - фальсе, а после заполнения всех связанных таблиц оно последним запросом меняется на трю. А пока не трю - считается что эта запись не существует. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: нет Всего: 61 |
Да я пока ещё ничего не делал, вот только сейчас дошёл до базы, вот тут-то и торможу, ну там геде всего одна таблица вроде всё понятно, а вот когда дошёл до заполнения 5 таблиц, что-то мне подсказало, что могут возникнуть проблемы. Спасибо, вроде всё понял. Т.е. id автоматически инкрементируется только в первой таблице, в последее поле, ну скажем ENUM('0','1'), вставляю 0, затем заполняю остальные 4 таблицы и в последнюю очередь меняю поле в первой таблице на 1, что и будет говорить о том, что запись была добавлена во все 5 таблиц. Ещё раз спасибо. -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 454 |
Именно. Еще рекомендую ввести timestamp обновления записи и периодически чистить БД от старых незавершенных записей. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: нет Всего: 61 |
Для этого раз в месяц будет запускаться по крону, скрипт который будет полностью парсить всю базу, это необходимо делать для других таблиц, вот я думаю в него и дописать подпрограмму и для этой таблицы. Удалять просто все поля где остались нули в контрольном поле???? А зачем TIMESTAMP??? Хотя у меня в первой таблице есть поле TIMESTAMP - дата добавления. Зы: А как получить Id после того как будет добавлена запись в первую таблицу??? Это сообщение отредактировал(а) korob2001 - 18.5.2005, 10:45 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| Kurt |
|
||||
|
Увлеченный ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1662 Регистрация: 22.8.2003 Где: Краснодар Репутация: 1 Всего: 36 |
-------------------- Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед) ... Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн) |
||||
|
|||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: нет Всего: 61 |
Всем большое спасибо за помощь, всё вроде понял, сейчас буду реализовывать.
-------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | MySQL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |