Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как лучше выполнить несколько запросов??? 
:(
    Опции темы
korob2001
Дата 15.5.2005, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: нет
Всего: 61



Привет, есть база в которой несколько таблиц. Мне нужно внести данные, полученные из формы сразу в несколько таблиц, т.е. эти данные разбиваются на несколько таблиц. Как лучше сделать такую вставку??? Допустим есть переменная $sql, генерирую запрос:
Код

#ГЕНЕРИРУЮ ЗАПРОС
$sql = "INSERT INTO table1 ( ..... ) VALUES ( ..... )";
# ДЕЛАЮ ЗАПРОС
$dbh->do( $sql );

#ГЕНЕРИРУЮ ЗАПРОС
$sql = "INSERT INTO table2 ( ..... ) VALUES ( ..... )";
# ДЕЛАЮ ЗАПРОС
$dbh->do( $sql );

#ГЕНЕРИРУЮ ЗАПРОС
$sql = "INSERT INTO table3 ( ..... ) VALUES ( ..... )";
# ДЕЛАЮ ЗАПРОС
$dbh->do( $sql );

Или таким образом:
Код

# Обединяю все три запроса в один
$sql  = "INSERT INTO table1 ( ..... ) VALUES ( ..... );";
$sql .= "INSERT INTO table2 ( ..... ) VALUES ( ..... );";
$sql .= "INSERT INTO table3 ( ..... ) VALUES ( ..... )";
# ДЕЛАЮ ЗАПРОС
$dbh->do( $sql );

Или может есть ещё какой нить способ??? Вобщем нужен совет.
Заранее спасибо,
Денис.

Это сообщение отредактировал(а) korob2001 - 15.5.2005, 11:13


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Kesh
Дата 15.5.2005, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2488
Регистрация: 31.7.2002
Где: Германия, Saarbrü cken

Репутация: 15
Всего: 54



Если возможно, то такие вещи лучше делать одной транзакцией...


--------------------
user posted image
PM MAIL WWW ICQ Skype   Вверх
Mal Hack
Дата 15.5.2005, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 8
Всего: 261



Цитата(Kesh @ 15.5.2005, 12:22)
Если возможно, то такие вещи лучше делать одной транзакцией...

MySQL ??? Дык вроде только в 5.

Цитата(korob2001 @ 15.5.2005, 12:12)
# Обединяю все три запроса в один
$sql  = "INSERT INTO table1 ( ..... ) VALUES ( ..... );";
$sql .= "INSERT INTO table2 ( ..... ) VALUES ( ..... );";
$sql .= "INSERT INTO table3 ( ..... ) VALUES ( ..... )";
# ДЕЛАЮ ЗАПРОС
$dbh->do( $sql );

Такой запрос через mysql_query не пройдет.
PM ICQ   Вверх
korob2001
Дата 15.5.2005, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: нет
Всего: 61



smile Получил такую ошибку в логе:
Цитата

NIEUWI~1.PL: DBD::mysql:smileb do failed: You have an error in your SQL syntax near '; INSERT INTO AutoMore ( Opmerkingen, Cylinderinhoud, TechControle, AntalDeuren,' at line 1 at \\home\\LOCALH~1\\cgi-bin\\nl\\ovi\\NIEUWI~1.PL line 1813.\n

Как я понимаю, это из-за того, что я соединил все эти запросы один и между ними поставил ';', т.е. получается запрос примерно такого вида:
Код

INSERT INTO table1 ( ..... ) VALUES ( ..... ); INSERT INTO table2 ( ..... ) VALUES ( ..... );

Так нельзя делать???

Ну собственно ещё вопрос на засыпку. Например когда я делаю запись в файл, мне нужно заблокировать его. Как быть с блокировкой в MySQL???

Это сообщение отредактировал(а) korob2001 - 15.5.2005, 12:45


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Kesh
Дата 15.5.2005, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2488
Регистрация: 31.7.2002
Где: Германия, Saarbrü cken

Репутация: 15
Всего: 54



Mal Hack Да нет... транзакции вроде еще и в 4-ке есть... только там нужно хранилище не MyISAM а InnoDB


--------------------
user posted image
PM MAIL WWW ICQ Skype   Вверх
Kurt
Дата 15.5.2005, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


Профиль
Группа: Участник Клуба
Сообщений: 1662
Регистрация: 22.8.2003
Где: Краснодар

Репутация: 1
Всего: 36



Цитата(korob2001)
Как быть с блокировкой в MySQL???

smile
Поясни вопрос.
Тебя интересует блокировка таблицы MySQL? Ну, так на время выполнения операций изменения данных (insert, update и т.п.) таблица автоматически блокируется. Можно блокировать вручную.


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
korob2001
Дата 16.5.2005, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: нет
Всего: 61



Цитата

Поясни вопрос.
Тебя интересует блокировка таблицы MySQL? Ну, так на время выполнения операций изменения данных (insert, update и т.п.) таблица автоматически блокируется. Можно блокировать вручную.

Привет!
Вобщем у меня есть 5 таблиц, все таблицы заполняются из одной большой формы, другими словами мне нужно как-то сделать так, что бы записи делались в них синхронно. Что бы не получилось так, что в одну таблицу запись добавится, а в другую нет. Мне нужно связать Id всех этих таблиц и как-то заблокировать их, что бы либо запись добавилась во все таблицы, либо не добавилась ни в одну из них.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Kesh
Дата 16.5.2005, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2488
Регистрация: 31.7.2002
Где: Германия, Saarbrü cken

Репутация: 15
Всего: 54



korob2001 Это есть транзакция... То есть либо все - либо ничего...


--------------------
user posted image
PM MAIL WWW ICQ Skype   Вверх
Kurt
Дата 16.5.2005, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


Профиль
Группа: Участник Клуба
Сообщений: 1662
Регистрация: 22.8.2003
Где: Краснодар

Репутация: 1
Всего: 36



Как уже говорилось, транзакции поддерживаются только форматом BDB или InnoDB, для остальных (в том числе и для типа по умолчанию MyISAM) - нет.

korob2001
Если у тебя BDB или InnoDB, можешь сделать так:
Код

begin;
insert into table1 values (...);
insert into table2 values (...);
commit;


Для остальных форматов таблицы можно заблокировать так:
Код

lock tables table1 WRITE, table2 WRITE;
insert into table1 values (...);
insert into table2 values (...);
unlock tables;


при этом ключевое слово WRITE полностью блокирует таблицу, если поставишь READ - для других юзеров будет разрешено чтение (но не запись!).


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
Akina
Дата 16.5.2005, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(Kurt @ 16.5.2005, 19:04)
Для остальных форматов таблицы можно заблокировать так:

Интересно, что будет при обвале скрипта посередь выполнения?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Kurt
Дата 16.5.2005, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


Профиль
Группа: Участник Клуба
Сообщений: 1662
Регистрация: 22.8.2003
Где: Краснодар

Репутация: 1
Всего: 36



Согласен. Плохо будет. ОЧЕНЬ плохо. smile
Честно говоря, я никогда вручную не лочил таблицы. Но другого выхода для такого формата таблиц я не знаю.


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
Akina
Дата 16.5.2005, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(Kurt @ 16.5.2005, 19:26)
другого выхода для такого формата таблиц я не знаю

Стандартный алгоритм... Temporary Tables + Garbage Table
Конечно при этом придется мириться с тайм-аутом поступления изменений...
Добавлено @ 18:29
Есть еще один выход - таблица резервирования ID-ов.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Kurt
Дата 16.5.2005, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


Профиль
Группа: Участник Клуба
Сообщений: 1662
Регистрация: 22.8.2003
Где: Краснодар

Репутация: 1
Всего: 36



Цитата
Есть еще один выход - таблица резервирования ID-ов.

Поясни, пожалуйста, что ты имеешь ввиду. Ну или ссылку кинь. Буду знать. smile


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
Illuminaty
Дата 16.5.2005, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


/*Антон Захаров*/
***


Профиль
Группа: Комодератор
Сообщений: 1238
Регистрация: 19.3.2005
Где: Россия, Казань

Репутация: 3
Всего: 56



Может быть поможет оператор INSERT DELAYED?
Почитать про него можно на оф. сайте здесь
PM MAIL ICQ   Вверх
Akina
Дата 17.5.2005, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Kurt
Проблема при добавлении в связанные таблицы при отсутствии транзакций - это а) контроль 100% выполнения всех запросов; б) согласованность резервирования ID-ов.
Суть: имеется специальная таблица, в которой для каждой из изменяемых таблиц есть поле соотв. ID-a. При необходимости занесения связных данных выбор ID-ов длЯ каждой из таблиц производится по признаку отсутствия как в самой таблице, так и в таблице резервирования. Когда массив ID-ов сформирован, он записывается в таблицу. Одним запросом. При высокой интенсивности обращений тут же проводится обратный контроль. Все, выделенные ID-ы уже никто не использует, и можно смело приступать к изменениям. Если все изменения прошли нормально - запись зарезервированных ID-ов удаляется. Именно с этого момента сразу все записи становятся доступны к использованию - до этого они считаются недействительными. И клиентская часть при выборках дополнительно контролирует, что ID-ы выбранных записей не фигурируют в таблице резервирования
Код
... AND ID NOT IN (SELECT Table2ID FROM Reserved)
Если целостность важнее производительности - вполне нормальный способ обеспечения согласованности данных


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
korob2001
Дата 17.5.2005, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: нет
Всего: 61



Цитата

Если целостность важнее производительности - вполне нормальный способ обеспечения согласованности данных

Конечно важнее, во первых потому, что если спутаются ID хотябы двух записей, весе 5 таблиц накроются, не буду говорить чем, smile во вторых у меня только одна такая форма, которую нужно разбивать на несколько таблиц, так как будет использоваться 3 вида поиска ( быстрый 1таб., обычный 2 таб., расширенный 5 таб.),

Вобщем как я понял, нужно сделать примерно следующее:
Для краткости, приведу пример на 2-х таблицах, ID которых должны строго совпадать:
Код

Table: TabFirst                                     
 ========== ======== ============ ========== =============
|    Id    |  Name  |   Birth    |  Index   |   DateReg   |
 ========== ======== ============ ========== =============
|  000001  |  Keon  | 1965-05-21 |   8900   | 2005-01-15  |
 ---------- -------- ------------ ---------- -------------
|  000002  |  Dirk  | 1978-11-07 |   1000   | 2005-01-22  |
 ---------- -------- ------------ ---------- -------------
|  000003  | Daniel | 1970-09-15 |   6500   | 2005-02-03  |
 ---------- -------- ------------ ---------- -------------
|  000004  |  Lisa  | 1968-06-04 |   7100   | 2005-02-10  |
 ---------- -------- ------------ ---------- -------------


Table: TabSecond
 ========== =========== =========== ============ ========================
|    Id    |   Phone   |    Fax    |     GSM    |          Email         |
 ========== =========== =========== ============ ========================
|  000001  | 057245178 | 057758457 | 0498554578 | [email protected]    |
 ---------- ----------- ------------ ---------- -------------------------
|  000002  | 032854592 | 032457454 | 0479458245 | [email protected]      |
 ---------- ----------- ------------ ---------- -------------------------
|  000003  | 045257841 | 045245784 | 0486045124 | [email protected]       |
 ---------- ----------- ------------ ---------- -------------------------
|  000004  | 081245864 | 081245783 | 0494365214 | [email protected] |
 ---------- ----------- ------------ ---------- -------------------------

Теперь мне, как я понял нужно создать ещё одну таблицу, в котой будет резервироваться Id. smile Стоп, а почему нельзя создать таблицу из 2-х полей Id и скажем времени??? Вот что я имею ввиду: Допустим чел заполнил форму, я добавляю в резервную таблицу запись текущего времени, ну скажем DATETIME, затем тут же получаю последний Id и вставляю его вместе с записями в таблицы которые я привёл выше. Естественно аuto_increment нужно будет убрать с этих таблиц. Что думаете???
Ещё я не понял: мне для каждой таблицы нужно создать отдельное поле в резервной таблице ID???

Цитата

Как уже говорилось, транзакции поддерживаются только форматом BDB или InnoDB, для остальных (в том числе и для типа по умолчанию MyISAM) - нет.

А если в таблице уже есть данные и я попытаюсь перевести её в другой формат, скажем в DBD или InnoDB, данные не будут потеряны или искажены???? Или как создать таблицу с форматом не по умолчанию???


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Akina
Дата 18.5.2005, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Погоди... у тебя связь 1:1 по ключевому полю в обеих таблицах??? ты офигел - такое делать, не имея механизма транзакций??? во второй таблице поле ID должно быть неключевым!!! и тогда никакой проблемы целостности просто не существует.

Для контроля в первую таблицу добавляется поле контроля полного занесения, дефолт - фальсе, а после заполнения всех связанных таблиц оно последним запросом меняется на трю. А пока не трю - считается что эта запись не существует.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
korob2001
Дата 18.5.2005, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: нет
Всего: 61



Цитата

ты офигел - такое делать, не имея механизма транзакций???

Да я пока ещё ничего не делал, вот только сейчас дошёл до базы, вот тут-то и торможу, ну там геде всего одна таблица вроде всё понятно, а вот когда дошёл до заполнения 5 таблиц, что-то мне подсказало, что могут возникнуть проблемы. smile Потому я здесь.
Спасибо, вроде всё понял. Т.е. id автоматически инкрементируется только в первой таблице, в последее поле, ну скажем ENUM('0','1'), вставляю 0, затем заполняю остальные 4 таблицы и в последнюю очередь меняю поле в первой таблице на 1, что и будет говорить о том, что запись была добавлена во все 5 таблиц.

Ещё раз спасибо.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Akina
Дата 18.5.2005, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(korob2001 @ 18.5.2005, 11:16)
id автоматически инкрементируется только в первой таблице, в последее поле, ну скажем ENUM('0','1'), вставляю 0, затем заполняю остальные 4 таблицы и в последнюю очередь меняю поле в первой таблице на 1, что и будет говорить о том, что запись была добавлена во все 5 таблиц.

Именно. Еще рекомендую ввести timestamp обновления записи и периодически чистить БД от старых незавершенных записей.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
korob2001
Дата 18.5.2005, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: нет
Всего: 61



Цитата

Именно. Еще рекомендую ввести timestamp обновления записи и периодически чистить БД от старых незавершенных записей.

Для этого раз в месяц будет запускаться по крону, скрипт который будет полностью парсить всю базу, это необходимо делать для других таблиц, вот я думаю в него и дописать подпрограмму и для этой таблицы. Удалять просто все поля где остались нули в контрольном поле???? А зачем TIMESTAMP??? Хотя у меня в первой таблице есть поле TIMESTAMP - дата добавления.

Зы: А как получить Id после того как будет добавлена запись в первую таблицу???

Это сообщение отредактировал(а) korob2001 - 18.5.2005, 10:45


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Kurt
Дата 18.5.2005, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


Профиль
Группа: Участник Клуба
Сообщений: 1662
Регистрация: 22.8.2003
Где: Краснодар

Репутация: 1
Всего: 36



Цитата
А как получить Id после того как будет добавлена запись в первую таблицу???

Код

select last_insert_id()



--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
korob2001
Дата 19.5.2005, 01:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: нет
Всего: 61



Всем большое спасибо за помощь, всё вроде понял, сейчас буду реализовывать. smile


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0708 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.