Модераторы: 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   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




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


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

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