Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.95/19: Рейтинг темы: голосов - 19, средняя оценка - 4.95
 Аватар для __PION__
960 / 801 / 85
Регистрация: 21.07.2010
Сообщений: 3,522

insert в 3 таблицы за один запрос

05.01.2012, 05:55. Показов 3707. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет!
Возникла необходимость сохранения инфы в таблицы одновременно.
Имеется форма, часть записей нужно сохранить в первую таблицу (category), часть во вторую (subcategory) + еще id тока что добавленной записи в таблице category
и фотки сохраняются в 3-ью таблицу (photo) + также и сюда надо сохранить id последней записи таблицы category.
Т.о., получается запись в таблице category и связанные с ней записи (через родительский id) в двух других таблицах.

Можно конечно написать 3 запроса, получая через mysql_insert_id() id последней записи в таблице категорий, но хотелось бы одним запросом.
в сети узнал, что такое можно сотворить с помощью триггеров, но с ними к сожалению не знаком.

Можно ли решить эту задачу без триггеров одним запросом?
Если нет, то прошу показать решение уже с помощью триггеров.

Спасибо
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.01.2012, 05:55
Ответы с готовыми решениями:

Как объединить несколько INSERT в один запрос
Я с MySQL недавно... поэтому вопрос чайника. Как объединить несколько команд INSERT или REPLACE в один запрос? Допустим в...

Не получается выполнить за один запрос много операций INSERT
Вообщем так. Выполняю вот такой вот запрос. $this->mysqli->query('insert into storage(date_storage, object_one, relation,...

Как сделать INSERT запрос в связанные таблицы
Вот есть у меня, например, Таблица1 с полями "Код" и "Имя" и Таблица2 с полями "Код" и "Фамилия". Вот обычный INSERT я делаю...

25
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
05.01.2012, 06:28
Цитата Сообщение от Love_and_Peace Посмотреть сообщение
в сети узнал, что такое можно сотворить с помощью триггеров, но с ними к сожалению не знаком.
Вы же в другие две таблицы помимо id из category еще и свои данные передаёте извне? В триггер их не передать.

Можно сделать с помощью хранимых процедур. Из своего кода останется только вызвать нужную процедуру:
SQL
1
CALL `create_photo`(42, 19, 'foo', 'bar', 37);
а уже процедура сделает всё, что нужно.
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
DELIMITER //
CREATE PROCEDURE `create_photo`(
    IN x INT,
    IN y INT,
    IN n VARCHAR(255),
    IN m VARCHAR(255),
    IN z INT
)
BEGIN
    DECLARE cid INT;
 
    INSERT INTO `category` (`name`, `value`) VALUES (n, x);
    SET cid = LAST_INSERT_ID();
    INSERT INTO `subcategory` (`cat_id`, `name`, `value`) VALUES (cid, m, y);
    INSERT INTO `photo` (`cat_id`, `value`) VALUES (cid, z);
END//
1
 Аватар для __PION__
960 / 801 / 85
Регистрация: 21.07.2010
Сообщений: 3,522
05.01.2012, 07:04  [ТС]
Цитата Сообщение от Vovan-VE Посмотреть сообщение
Вы же в другие две таблицы помимо id из category еще и свои данные передаёте извне?
да, данные из одной формы делятся на три части и распределяются по своим таблицам. Они должны быть связаны внешним ключем с таблицей category (для этого и нужен id последней записи из таблицы category).
В таком случае можно написать запрос с помощью триггера?
Цитата Сообщение от Vovan-VE Посмотреть сообщение
Из своего кода останется только вызвать нужную процедуру:
как это написать в пхп-код?

и на счет процедуры, м/у бегин и энд понятно вроеде что происходит, а что за
Цитата Сообщение от Vovan-VE Посмотреть сообщение
IN x INT,
IN y INT,
IN n VARCHAR(255),
IN m VARCHAR(255),
IN z INT
??
0
 Аватар для resource2008
111 / 112 / 18
Регистрация: 11.03.2011
Сообщений: 421
05.01.2012, 16:13
Цитата Сообщение от Love_and_Peace Посмотреть сообщение
как это написать в пхп-код?
может что-то типа такого

PHP
1
2
$query_str = "CALL `create_photo`(42, 19, 'foo', 'bar', 37);";
mysql_query( $query_str );
Цитата Сообщение от Love_and_Peace Посмотреть сообщение
В таком случае можно написать запрос с помощью триггера?
Цитата Сообщение от Vovan-VE Посмотреть сообщение
Вы же в другие две таблицы помимо id из category еще и свои данные передаёте извне? В триггер их не передать.
Цитата Сообщение от Love_and_Peace Посмотреть сообщение
а что за
Сообщение от Vovan-VE
IN x INT,
IN y INT,
IN n VARCHAR(255),
IN m VARCHAR(255),
IN z INT
??
ну... эм... как бы прототип, в процедуру ведь нужно отдать какие-то данные для выполнения (как раз вот те "из вне", о которых выше спрашивалось)

IN - переменная входящая (т.е. не возвращаемая, а получаемая),
x - имя переменной в процедуре,
INT - тип...
собственно как в любом я.п.
2
 Аватар для __PION__
960 / 801 / 85
Регистрация: 21.07.2010
Сообщений: 3,522
05.01.2012, 18:09  [ТС]
ну эт понятно, не понятным остается как из пхп переменные передавать в хранимку., т.е., как мне вместо x,y,z... передать перемнные из скрипта?
еще, я тут почитал, вроде перемнные в хранимке создаются через DECLARE, или я чет не так понял?
0
65 / 65 / 6
Регистрация: 22.09.2010
Сообщений: 182
05.01.2012, 18:12
PHP
1
2
$query_str = "CALL `create_photo`($a, 19, 'foo', $b, $c);";
mysql_query( $query_str );
вот так вот
1
 Аватар для __PION__
960 / 801 / 85
Регистрация: 21.07.2010
Сообщений: 3,522
05.01.2012, 18:41  [ТС]
Цитата Сообщение от Great-Antique Посмотреть сообщение
вот так вот
а..., вот я потупил
а что скажете на счет DECLARE или IN ?
0
65 / 65 / 6
Регистрация: 22.09.2010
Сообщений: 182
05.01.2012, 18:43
http://dev.mysql.com/doc/refma... edure.html
вот тут сказано IN (или OUT)
0
 Аватар для __PION__
960 / 801 / 85
Регистрация: 21.07.2010
Сообщений: 3,522
06.01.2012, 06:24  [ТС]
мужуки, хранимку сделал (правда не проверил), но есть такое поле у меня (corder), там значения строятся не извне, а сами формируются таким образом
SQL
1
SELECT IF(MAX(corder) IS NULL, 0, MAX(corder) + 1) AS ord FROM $dbTable
, где $dbTable - имя таблицы.
Как же теперь быть в хранимке, как мне передавать в поле corder главной таблицы такое вот значение?
как понимаю надо создать переменную наподобие этой
Цитата Сообщение от Vovan-VE Посмотреть сообщение
DECLARE cid INT;
, но к сажалению не пойму как именно это сделать.

Добавлено через 3 часа 21 минуту
не добвляются записи в БД
вот хранимка
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
DELIMITER //
 
DROP PROCEDURE IF EXISTS `db`.`ads` //
CREATE PROCEDURE `db`.`ads` (
      IN cat_name VARCHAR(100),
      IN cat_corder INT(11),
      IN cat_text MEDIUMTEXT,
      IN cat_img VARCHAR(100),
      IN cat_datetime DATETIME,
      IN cat_day TINYINT(4),
      IN cat_parent INT(11),
      IN cat_subparent INT(11),
      IN cat_type INT(11),
      IN cat_active TINYINT(4),
      IN cat_popular TINYINT(3),
      IN cat_color TINYINT(3),
      IN cat_agent INT(10),
 
      IN subcat_all_f TINYINT(3),
      IN subcat_f TINYINT(3),
      IN subcat_r TINYINT(3),
      IN subcat_h TINYINT(3),
      IN subcat_all_s SMALLINT(5),
      IN subcat_s SMALLINT(5),
      IN subcat_t VARCHAR(100),
      IN subcat_t_name VARCHAR(30),
      IN subcat_r VARCHAR(30),
      IN subcat_phone VARCHAR(20),
      IN subcat_price INT(10),
 
      IN photo1 VARCHAR(100),
      IN photo2 VARCHAR(100),
      IN photo3 VARCHAR(100),
      IN photo4 VARCHAR(100)
)
BEGIN
      DECLARE cid INT;
 
      INSERT INTO `db_ads_h` (`name`, `text`, `img`, `datetime`, `days`, `parent_cat`, `parent_subcat`, `type_premises`, `active`, `popular`, `color`, `agent`)
      VALUES (cat_name, cat_text, cat_img, cat_datetime, cat_day, cat_parent, cat_subparent, cat_type, cat_active, cat_popular, cat_color, cat_agency);
      SET cid = LAST_INSERT_ID();
      INSERT INTO `db_ads_params_h` (`all_f`, `field`, `room`, `height`, `area`, `premises`, `t_premises`, `t_name_premises`, `r_premises`, `phone`, `price`, `parent_ext`)
                                VALUES (subcat_all_f, subcat_f, subcat_r, subcat_h, subcat_all_s, subcat_s, subcat_t, subcat_t_name, subcat_r, subcat_phone, subcat_price, cid);
      INSERT INTO `db_ads_photo_h` (`photo1`, `photo2`, `photo3`, `photo4`, `parent_ext`) VALUES (photo1, photo2, photo3, photo4, cid);
END //
вот так вызываю
PHP
1
2
3
4
5
$query = "CALL `db.ads`('$ads_name', $corder, '$ads_form[ads_text]', $ads_date, $ads_day, $ads_sec, $ads_place, $ads_type, 0, 0, 0, 0, 
                                $ads_allf, $ads_f, $ads_r, $ads_form[ads_h], $ads_form[s_main], $ads_form[s], $ads_place, 
                                '$__t[$ads_place]', $ads_r, '$ads_form[ads_phone]', $ads_form[ads_price]
            )";
mysql_query($query);
Ошибки нет. Вывод запроса на экран
Code
1
CALL `db.ads`('Продать что-нибудь, Москва', 0, 'текст объявления', 2012-01-06 06:01:23, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 455, , 500, 1, 'Москва', 1, '89886504313', 77666 )
Добавлено через 2 минуты
из-за чего это может быть? я думал, что процедура не связана с БД, но я сделал дамп БД и эта процедура там присутствует. не пойму в чм дело
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
06.01.2012, 07:31
Цитата Сообщение от Love_and_Peace Посмотреть сообщение
из-за чего это может быть?
Забыли написать проверку и вывод ошибки в PHP (or die). Четвертый аргумент datetime надо передавать и виде строки.
1
65 / 65 / 6
Регистрация: 22.09.2010
Сообщений: 182
06.01.2012, 12:19
Цитата Сообщение от Love_and_Peace Посмотреть сообщение
2012-01-06 06:01:23
в кавычках должно это поле быть
1
 Аватар для __PION__
960 / 801 / 85
Регистрация: 21.07.2010
Сообщений: 3,522
06.01.2012, 19:58  [ТС]
да, ошибка показывается теперь, дело было в типе передаваемой переменной, но теперь такая ошибка
Code
1
Thread stack overrun: 6440 bytes used of a 131072 byte stack, and 128000 bytes needed. Use 'mysqld -O thread_stack=#' to specify a bigger stack.
тут как понимаю дело в памяти, но не пойму что к чему
0
 Аватар для resource2008
111 / 112 / 18
Регистрация: 11.03.2011
Сообщений: 421
06.01.2012, 23:46
не хватает памяти, выделенной для потока, который выполняет обработку.

в сети пишут, что в MySQL можно увеличить объем выделяемой памяти:
в my.cnf значение thread_stack

т.е. если тебе не хватает 128К, то можно установить 256К, например.

Добавлено через 1 минуту
Цитата Сообщение от Love_and_Peace Посмотреть сообщение
Use 'mysqld -O thread_stack=#'
хотя он тебе сам сообщил, какую команду нужно написать
1
 Аватар для __PION__
960 / 801 / 85
Регистрация: 21.07.2010
Сообщений: 3,522
07.01.2012, 01:49  [ТС]
м.., а куда это записать то?
у меня установлен Денвер, и где у него mysql хз
и почему ему не хватает памяти, у меня таблицы небольшие - по 16, 13 и 6 столбцов.
0
 Аватар для resource2008
111 / 112 / 18
Регистрация: 11.03.2011
Сообщений: 421
07.01.2012, 02:21
в денвере, если правильно помню

"папка денвера\usr\local\mysql\"
и тут в нем
my.cnf
открываем блокнотом, находим и меняем thread_stack

а в "папка денвера\usr\local\mysql\bin\"
mysqld.exe
который можно запустить из консоли с параметрами

и денвер наверное потом надо перезапустить
1
 Аватар для __PION__
960 / 801 / 85
Регистрация: 21.07.2010
Сообщений: 3,522
07.01.2012, 03:25  [ТС]
да, yes, получилось! :dance3:
Спасибо всем!
ТОка вот не понял почему 128кб не хватало, вроде инфа небольшая передается на сервер
На хосте тоже придется увеличивать память для мускула?
Ребяты, такой вопрос по теме еще -
вот третья таблица у меня (для дополнительных фоток) могут использовать только зарегисрированные пользователи, т.е., в обычной форме нет даже полей для дополнительных фоток, и в БД при сохранении записи в главную таблицу в третьей появляются пустые строки с id и parent_ext.
Отсюда вопрос, мне отдельные хранимки написать для каждого случая (для зарег-х и незарег-х) или можно эту же переделать, чтобы она под каждую форму работала по разному?
0
 Аватар для resource2008
111 / 112 / 18
Регистрация: 11.03.2011
Сообщений: 421
07.01.2012, 03:32
Цитата Сообщение от Love_and_Peace Посмотреть сообщение
Ока вот не понял почему 128кб не хватало, вроде инфа небольшая передается на сервер
это вроде бы баг какой-то из версий


Цитата Сообщение от Love_and_Peace Посмотреть сообщение
Отсюда вопрос, мне отдельные хранимки написать для каждого случая (для зарег-х и незарег-х) или можно эту же переделать, чтобы она под каждую форму работала по разному?
ну можешь попользоваться IF ... ELSE в хранимой процедуре
язык позволяет.
1
 Аватар для __PION__
960 / 801 / 85
Регистрация: 21.07.2010
Сообщений: 3,522
07.01.2012, 07:45  [ТС]
Цитата Сообщение от resource2008 Посмотреть сообщение
ну можешь попользоваться IF ... ELSE в хранимой процедуре
я написал условие, данные (точнее пустые строки) уже в третью таблицу не добавляются, а в остальные 2 добавляется все правильно, но выскакивает такая ошибка
Code
1
Unknown column 'photo1' in 'field list'
т.е., SQL говорит, что незнает такого поля, ну я ему просто данные не передаю, почему мускул так реагирует? по умолчанию значения полей для фоток в третьей таблице - NULL
Условие в хранимке
SQL
1
2
3
IF photo1 != NULL OR photo2 != NULL OR photo3 != NULL OR photo4 != NULL  THEN 
    INSERT INTO `house_ads_photo_h` (`photo1`, `photo2`, `photo3`, `photo4`, `parent_ext`) VALUES (photo1, photo2, photo3, photo4, cid);
END IF;
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
07.01.2012, 07:56
Love_and_Peace, Обзывать одинаковыми именами переменные, аргументы и поля таблиц - плохая идея.
0
 Аватар для __PION__
960 / 801 / 85
Регистрация: 21.07.2010
Сообщений: 3,522
07.01.2012, 08:23  [ТС]
Цитата Сообщение от Vovan-VE Посмотреть сообщение
Love_and_Peace, Обзывать одинаковыми именами переменные, аргументы и поля таблиц - плохая идея.
ну эт я так, временно.
все равно, вот поменял названия, точнее поменял названия в условии и добавил в список дополнительные перменные
SQL
1
2
3
4
IN photos1 VARCHAR(100), 
IN photos2 VARCHAR(100),
IN photos3 VARCHAR(100),
IN photos4 VARCHAR(100)
(а то я их уже удалял) потому что выскакивает такая ошибка
Code
1
Incorrect number of arguments for PROCEDURE house.ads; expected 27, got 23
Что это означает понимаю, но как решить не знаю. Получается условие не работает? но ведь записи в третью таблицу не добавляются. Что думаете?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.01.2012, 08:23
Помогаю со студенческими работами здесь

Составить запрос insert добавление для таблицы с ID
Здравствуйте, имеется таблица, которая содержит ID других таблиц(структуру базы смотреть во вложениях), хочу добавить туда новую запись, не...

Запрос на обновление, отняв один столбец из одной таблицы от другого столбца из другой таблицы
здравствуйте, как мне сделать запрос на обновление отняв один столбец из одной таблицы от другого столбца из другой таблицы?

Один запрос на 3 таблицы
Есть 3 таблицы.Ввожу данные в таблицу chast,ввожу данные в таблицу processor.В таблице comp_config должно быть так: столбец proces равен...

Один запрос на две таблицы
День добрый! У меня есть две таблицы t1 и t2. Могу ли я я в одном запросе вносить изменения в эти таблицы. например в таблице t1...

Перенос параметра при INSERT в другой запрос INSERT
Здравствуйте. Есть таблица Сlient, в которую при INSERT ClientID присваивается инкрементом. На этой же странице ниже прописываю второй...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru