Получение определенной строки, только что вставленной в таблицу SQL - PullRequest
2 голосов
/ 12 ноября 2010

У меня есть таблица с именем 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?

Ответы [ 3 ]

4 голосов
/ 12 ноября 2010
$dbh->last_insert_id();

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

2 голосов
/ 12 ноября 2010

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

0 голосов
/ 14 ноября 2010

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

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

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

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

...