November 2019

S M T W T F S
      12
34 5 678 9
10111213141516
17181920212223
24252627282930

Style Credit

Expand Cut Tags

No cut tags
Thursday, October 13th, 2005 12:21 pm
Ну вылитый паскаль.

Кроме того много думал о менталитете авторов Оракла. Он у них получился весь такой логичный-логичный. Но в некоторых местах всё-таки очень ненатуральный..

Вот, например, там нет автоинкрементируемых полей. Вместо них есть sequence, из которых при необходимости можно извлечь очередное значение и засунуть его в нужное поле. При добавлении записи это можно сделать автоматически, например, триггером.
Но вот как клиент может узнать, какое именно значение попало в свежедобавленную запись? Посмотреть в sequence можно, но если в это время кто-нибудь еще вставлял запись в ту же таблицу, то sequence мог уже поменяться.
[livejournal.com profile] cybernatic_cat предложил весь процесс вставки завернуть в хранимую функцию, которая будет сама извлекать очередное значение из sequence, и потом его возвращать.
Да, это будет надёжно работать, но.. как-то оно совсем ненатурально по сравнению с простым и логичным MySQLным SELECT LAST_INSERT_ID() или MSSQLным SELECT @@IDENTITY.

Или я просто не умею правильно готовить этих кошек?
Thursday, October 13th, 2005 11:54 am (UTC)
мысль понял, но вопрос не в уникальности select nextval, он и в оракле уникален. а в том, как клиент может узнать тот конкретный val, который был приделан в свежедобавленную запись
Thursday, October 13th, 2005 11:59 am (UTC)
В PostgreSQL есть функция currval (http://www.postgresql.org/docs/7.4/static/functions-sequence.html), которая именно это и возвращает. В Oracle должно быть нечто аналогичное.
Thursday, October 13th, 2005 12:01 pm (UTC)
а как он это узнает в мускуле?
Thursday, October 13th, 2005 12:02 pm (UTC)
запоминает для текущей сессии
Thursday, October 13th, 2005 12:04 pm (UTC)
ну так curval/nextval, как уже коллеги подметили.
только давайте определимся с терминами. как понимать "для текущей сессии"? сессии или транзакции?
Thursday, October 13th, 2005 12:14 pm (UTC)
вопрос правильный, но в данном конкретном случае для меня не принципиальный. я пока не собираюсь в одной сессии параллельно вставлять несколько записей :)
Thursday, October 13th, 2005 12:02 pm (UTC)
да, вот в чем тонкий момент. а нахера оно?
Thursday, October 13th, 2005 12:12 pm (UTC)
как это нахера? это совершенно типичная ситуация - добавили в таблицу новую запись, а теперь по ее уникальному ID к ней надо привязать другие записи, добавляемые в другие таблицы.