Конференция "Базы" » ID последней добавленной записи [D7, любая СУБД]
 
  • Ega23 © (04.09.08 16:46) [40]

    > более глупого поста чем Johnmen ©   (04.09.08 13:34) [32]
    > в этой ветке небыло.


    Вообще-то он как бы по делу спросил...
  • Курдль (04.09.08 16:52) [41]
    Жаль, что нельзя вставить в цитату все посты в этой ветке...
    Куда катится мир? До чего довел планету этот фигляр Пэжэ?!!


    > stas ©   (04.09.08 16:40) [39]
    >
    > Johnmen ©   (04.09.08 16:34) [38]
    > более глупого поста чем Johnmen ©   (04.09.08 13:34) [32]
    > в этой ветке небыло.


    БЫЛО!!! Вот это:

    > stas ©   (04.09.08 12:22) [5]
    >
    > DVM ©   (04.09.08 12:03)
    > наверное такой:
    > после вставки
    > select max(ID) from mytable

    Хотя они друг друга стоят.
  • Johnmen © (04.09.08 16:57) [42]

    > stas ©   (04.09.08 16:40) [39]
    > Johnmen ©   (04.09.08 16:34) [38]более глупого поста чем
    > Johnmen ©   (04.09.08 13:34) [32]в этой ветке небыло.

    Это ты так думаешь на основании своих убогих знаний и нулевого опыта.

    > Курдль   (04.09.08 16:52) [41]
    > Хотя они друг друга стоят.

    Не стОит право ровнять моё предложение [32] с [5].
    А то могу подумать грустное про тебя...:)
  • Правильный$Вася (04.09.08 17:01) [43]
    пошли разборки, пора закрываться
  • Ega23 © (04.09.08 17:01) [44]

    > Хотя они друг друга стоят.


    А в чём проблема генерации ID на клиенте? Искренне не понимаю...
  • Курдль (04.09.08 17:08) [45]
    Какой "клиент" может дать вам гарантированно уникальный идентификатор (не GUID)?
    Какой запрос гарантированно защитит вас от многопользовательской коллизии?

    Зачем СУБД городили все эти генераторы, последовательности, автоинкременты и т.п.?
  • Johnmen © (04.09.08 17:12) [46]

    > Какой "клиент" может дать вам гарантированно уникальный
    > идентификатор (не GUID)?

    А этого и не требуется :)

    > Какой запрос гарантированно защитит вас от многопользовательской  коллизии?

    Не запрос. А возвращаемая сервером ошибка.

    > Зачем СУБД городили все эти генераторы, последовательности,
    >  автоинкременты и т.п.?

    Перечитай постановку вопроса автора ветки.

    ЗЫ
    Начинаешь огорчать...:(
  • Johnmen © (04.09.08 17:13) [47]
    > Какой "клиент" может дать вам гарантированно уникальный
    > идентификатор (не GUID)?
    Кстати, и GUID не гарантирует...
  • Курдль (04.09.08 17:27) [48]

    > Johnmen ©   (04.09.08 17:12) [46]
    > Перечитай постановку вопроса автора ветки.


    Я именно поэтому привел цитату из Кин-дза-дзы.
    Ну, автор решил осчастливить мир каким-нибудь компонентом, который "может все".
    А вы-то что? Почему в первом же посте не сказали, что ЭТО НЕВОЗМОЖНО.
    Почитайте спец. литературу по СУБД и найдите там "альтернативные" варианты получения уникальных идентификаторов.
  • Правильный$Вася (04.09.08 17:31) [49]

    > Почему в первом же посте не сказали, что ЭТО НЕВОЗМОЖНО

    да ну? я ж сказал - бессмысленно
  • stas © (04.09.08 17:37) [50]
    1. Гарантирует уникальность автоинкримент
    2. определить последнию вставленную запись универсальным методом можно
    select max(ID) from mytable в рамках одной транзакции
    и без извращений описаных в Ega23 ©   (04.09.08 13:31) [31]
    если так рассуждать можно любой метод завалить
    3. Давать глупые советы и доказывать что они умные еще глупее тем более если у тебя в анкете буква M
    4. чем глупее [5] чем [39] обоснуй пожалуйста
    5. Попробуйте доказать обратное 1 и 2.
  • Ega23 © (04.09.08 17:43) [51]

    > 1. Гарантирует уникальность автоинкримент


    1. Не гарантирует (для MSSQL способы "ломания" я уже приводил. Есть и другие).
    2. Есть далеко не везде.
    3. select max(ID) Если уж взялся такое писать, то пиши как положено:
    select IsNull(max(ID) + 1, 1)

  • Правильный$Вася (04.09.08 17:43) [52]

    > определить последнию вставленную запись универсальным методом
    > можноselect max(ID) from mytable в рамках одной транзакции

    только в однопользовательском случае, не бывает междупользовательских транзакций
    в остальных случаях последняя вставленная может быть совсем не твоя
    мало того, если инкремент делать -1, то и не max вовсе нужно использовать
  • stas © (04.09.08 17:48) [53]
    Ega23 ©   (04.09.08 17:43) [51]
    зачем +1 это же не будет ID последней вставленной записи.
  • Ega23 © (04.09.08 18:01) [54]

    > зачем +1 это же не будет ID последней вставленной записи.


    Зачем мне ID "последней вставленной записи"?
    И что будет, если таблица пустая?
  • Правильный$Вася (04.09.08 18:25) [55]

    > Зачем мне ID "последней вставленной записи"?

    Олег, ты заголовок темы забыл :)
    а зачем - так хотя бы для того, чтобы использовать его в других таблицах в рамках транзакции

    > И что будет, если таблица пустая?

    вряд ли она будет пустая, если запись только что добавили (хотя варианты есть, конечно)
  • Ega23 © (04.09.08 18:39) [56]

    > Олег, ты заголовок темы забыл :)
    > а зачем - так хотя бы для того, чтобы использовать его в
    > других таблицах в рамках транзакции


    Declare @ID int;
    Select @ID=IsNull(Max(ID) + 1, 1) from Table;
    Insert into Table (ID, ....) Values (@ID, ...)



    Только так, по-другому низя....
  • stas © (04.09.08 21:41) [57]
    Ega23 ©   (04.09.08 18:39) [56]

    я предлагал так:
    Declare @ID int;
    Insert into Table (....) Values ( ...)
    Select @ID=select Max(ID)  from Table;

  • stas © (04.09.08 21:58) [58]
    Правильный$Вася   (04.09.08 17:43) [52]

    > begin tran
    > Declare @ID int
    > Insert into Table (....) Values ( ...)
    > Select @ID=select Max(ID)  from Table;
    > commit tran

    Это пройдет в рамках одной транзакции, что исключает между инструкциями выполнение другой транзакции
  • Правильный$Вася (04.09.08 22:14) [59]

    > stas ©   (04.09.08 21:58) [58]

    дудки
    другая транзакция (от другого подключения) может запросто закончиться где-нить между Insert и select, в результате ты увидишь чужой id
 
Конференция "Базы" » ID последней добавленной записи [D7, любая СУБД]
Есть новые Нет новых   [134477   +43][b:0][p:0.001]