Получение определенной строки, только что вставленной в таблицу SQL

У меня есть таблица с именем BUILD_INFO, и она имеет следующие столбцы:

  • BUILD_ID
  • BUILD_NAME
  • DATE
  • USER

BUILD_ID — это поле автоинкремента, поэтому я не устанавливаю его при вставке. Это первичный ключ, который используется для связи этой строки в этой таблице с другими строками в других таблицах.

Когда я вставляю новую строку в таблицу BUILD_INFO, я хочу знать установленную BUILD_ID, чтобы я мог извлечь ее и использовать при добавлении строк в другие таблицы.

Я не могу запросить его по другим столбцам, потому что другие строки могут дублировать значения этих столбцов. Я не могу просто повторно запросить таблицу и получить самые большие BUILD_ID, потому что другой пользователь мог вставить строку после меня. Было бы неплохо, если бы было что-то вроде Row Number, с помощью которого я мог бы получать и запрашивать строки. Что-то подобное существует?

Я пишу свой скрипт на Perl, используя модуль DBI, и моей базой данных может быть Oracle или MySql.

Как я могу получить информацию о строке, которую я только что вставил в SQL или с помощью модуля Perl DBI?


person David W.    schedule 12.11.2010    source источник


Ответы (3)


$dbh->last_insert_id();

Но см. предостережения в http://p3rl.org/DBI#last_insert_id.

person ysth    schedule 12.11.2010

Похоже, вам нужен метод last_insert_id для дескриптора базы данных. Но на самом деле ваша жизнь была бы намного проще, если бы вы посмотрели на DBIx::Class. и перестал писать сырой SQL.

person Dave Cross    schedule 12.11.2010
comment
Я читаю документацию, но не понимаю, где (и если) она указывает следующую информацию. Я правильно понимаю, что last_inser_id специфичен для моего dbHandle? Так что, если я вставляю строку, используя ее, и сплю в течение 30 секунд, в течение которых N строк были вставлены другими dbHandle, когда мой dbHandle просыпается и идет, чтобы получить свой last_insert_id, у него будет тот, который он вставил до того, как он перешел к спать? - person Yevgeny Simkin; 12.11.2010
comment
Конечно, это достаточно просто, чтобы проверить. Просто напишите тестовую программу с несколькими dbh и посмотрите, что происходит с last_insert_id, когда вы вставляете строки, используя разные дескрипторы базы данных. Мне кажется, что last_insert_id устанавливается и сохраняется по мере того, как происходит вставка, поэтому он будет правильным независимо от того, что произошло с другими дескрипторами. - person Dave Cross; 12.11.2010
comment
@Доктор. Dredel: да, по крайней мере, для MySQL; для Oracle проверьте документацию по используемому вами DBD. - person ysth; 12.11.2010
comment
davorg, Не придираться к гнидам, но я бы сказал, что подавляющее большинство вопросов, которые здесь задают, достаточно легко проверить. Весь смысл в том, чтобы использовать (и вносить свой вклад) коллективную базу знаний ваших коллег, которые уже написали указанные тесты, чтобы сэкономить себе много времени и, возможно, наткнуться (как я только что сделал в этой теме) на более элегантные решения. к проблемам, которые имели альтернативные (менее элегантные) решения в моем коде. (Спасибо, кстати, за публикацию этого ответа!). - person Yevgeny Simkin; 12.11.2010

Спасибо davorg за указание на метод DBI->last_inserted_row() в пакете DBI. Я новичок в пакете DBI и каким-то образом пропустил его, несмотря на то, что он четко указан всего двумя записями над методом selectrow_hashref в индексе HTML. Это похоже на то, что я ищу.

Что касается вашего беспокойства, я на самом деле создаю пакет, чтобы мы могли не писать необработанные SQL-запросы. Я ненавижу необработанные SQL-запросы по разным причинам. Во-первых, большинству разработчиков не так просто написать их, и их может быть сложно понять. Кроме того, они обычно жестко запрограммированы на предположения о структуре базы данных и о том, как она связана. Самое главное, что большинство разработчиков не умеют их писать.

Хотел бы я знать о DBIx раньше. Это сэкономило бы мне много работы. Проблема в том, что наша машина для разработки не имеет доступа к Интернету, что делает установку пакетов большой проблемой. Мне нужно просмотреть документацию DBIx. Прямо сейчас это выглядит немного сложнее, чем то, что нам нужно.

Спасибо также ysth за указание на метод DBI->last_insert_row() (и связанные с ним предостережения). Почему-то я пропустил этот метод, когда читал документацию DBI. Мне нужно посмотреть, работает ли это в Oracle. Это будет работать с MySql, потому что столбец, по которому мы индексируем нашу таблицу, является столбцом с автоинкрементом.

person David W.    schedule 14.11.2010