2010-11-12 1 views
2

я таблица называется BUILD_INFO и она имеет следующие столбцы:Получение конкретной строки просто вставляется в таблицу SQL

  • BUILD_ID
  • BUILD_NAME
  • DATE
  • USER

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

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

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

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

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

ответ

2

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

+0

Я читаю документацию, но неясно, где (или если) она указывает следующую информацию. Должен ли я понять, что last_inser_id специфичен для моего dbHandle? Поэтому, если я вставляю строку, используя ее, и спаю в течение 30 секунд, в течение которого N количество строк было вставлено другими dbHandles, когда мой dbHandle просыпается и отправляется на получение его last_insert_id, он будет иметь тот, который он вставил, прежде чем он перешел к спать? –

+0

Наверняка это достаточно простая вещь для проверки. Просто напишите тестовую программу с более чем одной dbh и посмотрите, что происходит с last_insert_id, когда вы вставляете строки, используя разные дескрипторы базы данных. Мне кажется, что last_insert_id установлен и сохраняется, когда происходит вставка, поэтому он будет правильным, независимо от того, что произошло на других дескрипторах. –

+1

@Dr. Dredel: да, по крайней мере, для MySQL; для Oracle, проверьте документацию для используемого DBD. – ysth

0

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^