Извлича конкретен ред, току-що вмъкнат в 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