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 12:40 pm (UTC)
Да.
Но вообще - не надо триггеры на это пользовать. Правильнее в инсерте сказать seqname.NEXTVAL
Thursday, October 13th, 2005 12:57 pm (UTC)
Не-а. Правильно, чтобы о целостности и непротиворечивости данных заботилась СУБД, а не приложение. Поэтому если автоинкремента нет, то пусть будет триггер.
Thursday, October 13th, 2005 01:17 pm (UTC)
Тогда тебе и currval не нужен. Делай insert, потом select его обратно, по каким-нибудь характерным признакам. Пусть база заботится.
Thursday, October 13th, 2005 01:23 pm (UTC)
Характерные признаки правильно называются "уникальный ключ". Если б он у меня был, известный клиенту, мне бы ID не понадобился :)