Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Как получить все id вставленные последним запросом?

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Bio man
Отправлено: 16 Ноября, 2012 - 00:29:40
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




вот значит код



Это вставляет несколько записей, id которых мне нужно получить например в переменную (SET @var...) через запятую, или каким другим образом.

(Отредактировано автором: 16 Ноября, 2012 - 17:32:26)

 
 Top
tuareg
Отправлено: 16 Ноября, 2012 - 05:40:35
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




триггеры. В процедуре ни как.

(Отредактировано автором: 16 Ноября, 2012 - 05:42:03)

 
 Top
Zuldek
Отправлено: 16 Ноября, 2012 - 08:49:06
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010  


Помог: 50 раз(а)




А что мешает получить LAST_INSERT_ID() и вычитая 1 получить нужное количество id добавленных запросом записей?
Поле авто-инкремент, полагаю.

(Отредактировано автором: 16 Ноября, 2012 - 08:52:26)

 
 Top
Мелкий Супермодератор
Отправлено: 16 Ноября, 2012 - 08:53:22
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




В принципе, и innodb и myisam строки вставляют одной операцией, параллельно другие вставки не производятся. Поэтому значения AI последовательны для одного многострочного инсерта.
Но это может быть изменено в будущем (или уже).

Нативного способа нету, можно ввести фиктивное поле, в которое сохранять, например, id соединения и потом по нему выбрать присвоенные id'шки.


-----
PostgreSQL DBA
 
 Top
Zuldek
Отправлено: 16 Ноября, 2012 - 08:59:29
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010  


Помог: 50 раз(а)




мускул сам блокировку таблиц включает... если подсчет id нужно сделать после завершения одной сессии - использовать дополнительную к автоматической блокировку таблиц. Если нельзя, - то да, временная таблица или фиктивное поле.
 
 Top
Bio man
Отправлено: 16 Ноября, 2012 - 17:35:30
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




Другой вопрос.

Задача перевести логику управления с РНР в SQL, типо цикл, переменные перенести в sql, что бы выполнялась та же задача.
Возможно это?
Или хотя бы нужно оптимизировать...

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. $sql = "
  4. INSERT INTO
  5. `ttables`
  6. VALUES(
  7. NULL,
  8. 0,
  9. '11-11',
  10. '11-12',
  11. CONCAT('test_name_copy_',
  12. (SELECT
  13. MAX(`id`)+1
  14. FROM `ttables` tt
  15. LIMIT 1)
  16. ),
  17. 102,
  18. 16);
  19. ";
  20.  
  21. $lastId = mysql_insert_id();
  22.  
  23. $sql = "SELECT `id` FROM `stops` WHERE `ttable_id` = $id;";
  24. $res = mysql_query($sql);
  25.  
  26. while($row = mysql_fetch_row($res)){
  27.         $sql = "
  28.         INSERT INTO     `stops`
  29.         (`ttable_id`,
  30.         `name`,
  31.         `ord_number`,
  32.         `latitude`,
  33.         `longitude`,
  34.         `dec_latitude`,
  35.         `dec_longitude`)
  36.         SELECT
  37.                 $lastId,
  38.                 `name`,
  39.                 `ord_number`,
  40.                 `latitude`,
  41.                 `longitude`,
  42.                 `dec_latitude`,
  43.                 `dec_longitude`
  44.                 FROM `stops`
  45.                 WHERE `id` = {$row[0]} LIMIT 1;
  46.         ";
  47.         mysql_query($sql);
  48.        
  49.         $newStopId = mysql_insert_id();
  50.        
  51.         $sql = "
  52.         INSERT INTO `stop_time`
  53.         (`stop_id`, `stop_time`)
  54.                 SELECT $newStopId, `stop_time`
  55.                 FROM `stop_time`
  56.                 WHERE `stop_id` = {$row[0]};
  57.         ";
  58. }

(Отредактировано автором: 16 Ноября, 2012 - 17:42:54)

 
 Top
tuareg
Отправлено: 17 Ноября, 2012 - 09:39:25
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




Читаем про курсоры MySQL. Запросы в цикле--> подготовленные выражения. Улыбка
Или нужен код?
P.S LIMIT 1 Можно убрать, если поле уникальный индекс(AI и т.п)
 
 Top
Bio man
Отправлено: 17 Ноября, 2012 - 10:59:46
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




tuareg пишет:
Или нужен код?
ну можешь привести подобный. Напомню еще раз задачу. Есть например несколько stops, нужно обойти их в цикле и в каждой итерации добавлять stop и stop_time, используя в stop_time last_ins_id от только что вставленного stop.
 
 Top
tuareg
Отправлено: 17 Ноября, 2012 - 11:16:48
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




Что-то типа такого писал тут, так что ...
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. CREATE PROCEDURE `myProcedure`(param int(1))
  3. body:
  4. BEGIN
  5. INSERT INTO
  6. `ttables`
  7. VALUES(
  8. NULL,
  9. 0,
  10. '11-11',
  11. '11-12',
  12. CONCAT('test_name_copy_',
  13. (SELECT
  14. MAX(`id`)+1
  15. FROM `ttables` tt
  16. LIMIT 1)
  17. ),
  18. 102,
  19. 16);
  20. SET @lastId=LAST_INSERT_ID(); # получили последний id
  21. SET @idd=0;
  22.  BEGIN
  23.   DECLARE `done`,`idd` int(11) UNSIGNED DEFAULT 0;
  24.   DECLARE insertBd CURSOR FOR SELECT `id` FROM `stops` WHERE `ttable_id`=@lastId;
  25.    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
  26.   Open insertBd;
  27.   WHILE done = 0 DO
  28.     FETCH insertBd INTO @idd;
  29.        SET @stmt_text := "
  30.        INSERT INTO     `stops`
  31.        (`ttable_id`,
  32.        `name`,
  33.        `ord_number`,
  34.        `latitude`,
  35.        `longitude`,
  36.        `dec_latitude`,
  37.        `dec_longitude`)
  38.        SELECT
  39.                ?,
  40.                `name`,
  41.                `ord_number`,
  42.                `latitude`,
  43.                `longitude`,
  44.                `dec_latitude`,
  45.                `dec_longitude`
  46.                FROM `stops`
  47.                WHERE `id` = ? LIMIT 1;
  48.        "
  49.         PREPARE stmt FROM @stmt_text;
  50.         EXECUTE stmt USING @lastId,@idd ;
  51.         DEALLOCATE PREPARE stmt;
  52.         /*тут второй запрос по аналогии*/
  53.   END WHILE;
  54.   CLOSE transformTable;
  55.   END
  56. END;
  57.  
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB