Форум: "Базы";
Текущий архив: 2005.06.06;
Скачать: [xml.tar.bz2];
ВнизINSERT в MSSQL Найти похожие ветки
← →
ST (2005-04-28 12:23) [0]Господа, подскажите, можно ли при выполнении INSERT на MSSQL 2000 вытащить полученный автоинкрементом новый индекс записи в одном запросе.
← →
Anatoly Podgoretsky © (2005-04-28 12:24) [1]Только после
← →
mariya_mezenceva © (2005-04-28 12:33) [2]select IDENT_CURRENT("table_name")
← →
Anatoly Podgoretsky © (2005-04-28 12:50) [3]Только не это, рекомендую прочить справку прежде чем подобное советовать.
← →
mariya_mezenceva © (2005-04-28 12:58) [4]прекрасно работает
я всегда делаю так
(реализую в хранимой процедуре)
CREATE PROCEDURE pinstable_name
@f varchar(10),
...,
@id int output
AS
insert into table_name(f,...) values (@f,...)
select @id=IDENT_CURRENT("table_name")
← →
ANB © (2005-04-28 13:01) [5]insert into table1 (A,B,C) values ("A", "B", "C")
select @@identity as NEW_ID
Все это надо засунуть в одну кверю и выполнять не Execute, а Open. После открытия можно будет прочитать в FieldByName("NEW_ID") добавленный ID. Другие способы некорректны.
← →
ANB © (2005-04-28 13:03) [6]IDENT_CURRENT - вернет текущее значение ID, и не факт, что твое, если с таблицей работают часто.
← →
msguns © (2005-04-28 13:06) [7]Есть такой немудреный способ:
1. Создается таблица со структурой (#AUTOID)
TableName VARCHAR
CURID INTEGER
2. Содается ХП, которая делает так
- Блокирует таблицу
- считывает значение CURID из этой таблицы из соотв.записи
- Значение = Значение + 1
- UPDATE счетчику в таблице на Значение
- Разблокирует таблицу
- Возвращает Значение
3. На каждую таблицу БД, где надо счетчик, создается триггер, срабатывающий ДО вставки. Это триггер проверяет значение ID и, если оно NULL, то обращается к указанной процедуре за значением счетчика
В результате ID можно получить на клиенте БЕЗ вставки (точнее ДО). Таким образом можно "обмануть" SQL-Server, "подменив" его фукцию автоинкремента.
Других эффиективных способов получения уникального ID ДО вставки я не знаю, хотя весьма интересовался этой проблемой. В т.ч. и на этом форуме.
← →
Anatoly Podgoretsky © (2005-04-28 13:11) [8]mariya_mezenceva © (28.04.05 12:58) [4]
прекрасно работаешь над разрушением логической целостности базы.
← →
ANB © (2005-04-28 15:40) [9]
> msguns © (28.04.05 13:06) [7]
- читай топик ("до" не надо, нужен аналог ретурнинг Oracle).
> Таким образом можно "обмануть" SQL-Server,
- не надо его обманывать. В нем есть штатные функции для этих целей. А это изгал.
← →
msguns © (2005-04-28 15:56) [10]>ANB © (28.04.05 15:40) [9]
>- читай топик ("до" не надо, нужен аналог ретурнинг Oracle).
С этим согласен.
>- не надо его обманывать. В нем есть штатные функции для этих целей. А это изгал.
С этим нет. Не надо заставлять всех ходить в таких же тапочках, как у тебя. Не взирая на погоду и мозоли ;)
← →
ANB © (2005-04-28 16:07) [11]
> Не взирая на погоду и мозоли ;)
- твой способ набъет мозоли юзеру. Зачем изобретать велосипед, если он уже изобретен ? Фактически, ты предлагаешь не использовать автоинкрементальные поля. А если они уже есть в базе и убрать ты их не имеешь права ?
Хе, видел давеча хохму : таблица в MS SQL с единственным полем - автоинкрементальным ID. Интересно, как на нее инсерт написать ?
← →
msguns © (2005-04-28 16:28) [12]>ANB © (28.04.05 16:07) [11]
>- твой способ набъет мозоли юзеру.
Каким образом, если не секрет ?
>Фактически, ты предлагаешь не использовать автоинкрементальные поля.
Я это предлагал ?
← →
ANB © (2005-04-28 16:46) [13]
> Я это предлагал ?
а как ты проинсертишь запись с этим сгенеренным ID ? Инсерт в студию !
← →
ANB © (2005-04-28 16:52) [14]
> msguns © (28.04.05 16:28) [12]
- слушай, а чего это мы с тобой бодаемся, если автор топика давно свалил ?
← →
Max Zyuzin © (2005-04-28 17:03) [15]>ANB © (28.04.05 16:52) [14]
Я вот согласен с msguns © (28.04.05 13:06) [7] тоже порылся по форумам, почитал макулатуру, и решил что это и есть самый оптимальный способ.
← →
ANB © (2005-04-28 17:09) [16]
> Max Zyuzin © (28.04.05 17:03) [15]
- см.
> ANB © (28.04.05 16:46) [13]
← →
Fay © (2005-04-28 17:10) [17]Max Zyuzin © (28.04.05 17:03) [15]
Где это Вы видели триггеры BEFORE в MSSQL?!
← →
ANB © (2005-04-28 17:15) [18]
> Fay © (28.04.05 17:10) [17]
триггера на таблицы в MS SQL в принципе BEFORE и есть . . . А разве не так ?
← →
Max Zyuzin © (2005-04-28 17:19) [19]>ANB © (28.04.05 17:09) [16]
Я про триггеры и не говорил, я вообще использую такую конструкцию только для добавления в master-detail на "лету", что бы все добавлялось в одной быстрой транзакции, я сначала получаю ID master-а вышеуказаным способом, потом в одной транзакции все толкаю сразу в обе таблицы, вот.
← →
ANB © (2005-04-28 17:22) [20]
> Max Zyuzin © (28.04.05 17:19) [19]
- ты не понял вопроса, как ты засовываешь свой сгенеренный ID в таблицу ? Если у нее ID автоинкрементальный ?
← →
Max Zyuzin © (2005-04-28 17:27) [21]>ANB © (28.04.05 17:22) [20]
ID в таблицы типа BigInt и усе... никаких Identity. Все "автоинкрементирование" виртуальное... на уровне приложения осуществляется, я понимаю что это ни есть гуд, только вот другого способа я так и не нашел...
← →
ANB © (2005-04-28 17:42) [22]
> Max Zyuzin © (28.04.05 17:27) [21]
- топик читал ? Поле уже автоинкрементальное.
> другого способа я так и не нашел...
- select @@identity - это и есть нормальный способ. Мне его ребята в РНИВЦ в Нижнем подсказали. Я до этого сам максом последний ID доставал.
И не всегда ты имеешь право перепроектировать БД. Плюс, тебе придется либо генерить ID уникальный по всей базе (что не плохо, но на каждой операции у тебя все клиенты будут ждать разблокировки служебной таблицы), либо заводить эту таблицу для каждой таблицы с данными. Тогда проще max юзать и саму таблицу с данными блокировать.
← →
Johnmen © (2005-04-28 17:43) [23]Мои три копейки - так и только так : ANB © (28.04.05 13:01) [5]
Обсуждение альтернативных "рукоёмких" способов неуместно, ИМХО.
← →
ANB © (2005-04-28 17:49) [24]
> Johnmen © (28.04.05 17:43) [23]
- почему, я лично предпочитаю юзать сиквенсы или GUID. Но по данному топику другого ответа действительно нет.
← →
Fay © (2005-04-28 18:04) [25]ANB © (28.04.05 17:15) [18]
AFTER
← →
ANB © (2005-04-29 09:31) [26]
> Fay © (28.04.05 18:04) [25]
> ANB © (28.04.05 17:15) [18]
> AFTER
- то есть срабатывает после инсерта ? Быть такого не может. А как же тогда подменять поля при необходимости ? Прямо табличку апдейтить ? И опять на триггер нарываться ? У тебя стоит MS SQL ? Если да, то слазий в хелп, плз, а то у меня его сейчас нет.
← →
Johnmen © (2005-04-29 09:51) [27]>ANB © (29.04.05 09:31) [26]
CREATE TRIGGER trigger_name
...
{{{ FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }
...
← →
ANB © (2005-04-29 10:34) [28]
> Johnmen © (29.04.05 09:51) [27]
- это ты для MS SQL выдрал ? Интересно, зачем им триггера AFTER, они же с наборами данных работают deleted и inserted . . . Да ладно, не принципиально. Получается что BEFORE таки есть. Один хрен, для автоинкрементального поля ID в триггере не подменишь.
← →
Polevi © (2005-04-29 10:56) [29]>ANB © (29.04.05 10:34) [28]
достал ты уже своим невежеством, изучи сервер сначала а потом советы давай
начальник ему плохой посоветовал.. дадад
начни со своего вопроса в [11]
← →
ANB © (2005-04-29 11:04) [30]
> начни со своего вопроса в [11]
- это был не мой вопрос.
← →
ANB © (2005-04-29 11:06) [31]
> достал ты уже своим невежеством
- и чего я неправильно насоветовал ?
> начальник ему плохой посоветовал.. дадад
- и где тут про начальника ?
← →
Polevi © (2005-04-29 11:19) [32]>таблица в MS SQL с единственным полем - автоинкрементальным ID. >Интересно, как на нее инсерт написать ?
про начальника в другой ветке
← →
ANB © (2005-04-29 11:22) [33]
> про начальника в другой ветке
- а так это я только неделю как работать начал. И у нас и правда такая фигня была - даже новую кнопку на форме нужно было согласовывать. То есть, сначала делаешь как велели (и по барабану, как работает), а потом можешь внести свои предложения.
> >Интересно, как на нее инсерт написать ?
- ну и как (не отключая автоинкрементарность) ?
← →
Polevi © (2005-04-29 13:24) [34]insert into sometable default values
← →
Fay © (2005-04-29 13:36) [35]Polevi © (29.04.05 13:24) [34]
Спасибо за поддержку. Почему-то большинство людей не верит в то, что я говорю 8)
← →
Polevi © (2005-04-29 13:39) [36]>Fay © (29.04.05 13:36) [35]
ты обращайся если что :-)
← →
ANB © (2005-04-29 13:53) [37]
> Polevi © (29.04.05 13:24) [34]
- круто. Я этого не нашел. В этой же базе была еще табличка с автоинкрементальным ID и пустым полем (всегда null). Мы сначала прикалывались после Oracle - зачем это. Потом дошло, что это для инсерта поле добавили. А потом разработчики, похоже, узнали про default values и родили табличку с одним ID. И мы ломали голову, как в нее теперь инсертят. Теперь понятно.
← →
Stanislav © (2005-04-29 14:09) [38]ST (28.04.05 12:23)
Тебе нужно после инсерта узнать номер записи которую ты вставил ?
← →
Polevi © (2005-04-29 14:23) [39]да, № п/п
как в накладной
← →
Stanislav © (2005-04-29 14:36) [40]А так:
Insert ...
select max(id) from mytable ?
← →
Polevi © (2005-04-29 14:42) [41]>Stanislav © (29.04.05 14:36) [40]
даже не смешно, умолкни
← →
Stanislav © (2005-04-29 14:47) [42]Polevi © (29.04.05 14:42) [41]
Непонял ???
← →
Polevi © (2005-04-29 14:48) [43]я понял что ты не понял
← →
msguns © (2005-04-29 15:01) [44]>Stanislav © (29.04.05 14:47) [42]
>Непонял ???
Всю ветку в лом прочесть ?
← →
Stanislav © (2005-04-29 15:02) [45]Помоему тебе пора замолкнуть, кокого ты вообще в эту ветку встрял и не одного дельного совета человеку.
И кто тебе мастера дал?
← →
Stanislav © (2005-04-29 15:05) [46]msguns © (29.04.05 15:01) [44]
А я ее прочел и что?
← →
ANB © (2005-04-29 15:05) [47]Гы гы. Ща кто то в орешник влетит.
← →
msguns © (2005-04-29 15:23) [48]>Stanislav © (29.04.05 15:05) [46]
>А я ее прочел и что?
А то, что так :>Stanislav © (29.04.05 14:36) [40]
А так:
Insert ...
select max(id) from mytable ?
писать нельзя.
← →
Stanislav © (2005-04-29 15:33) [49]msguns © (29.04.05 15:23) [48]
Я так понимаю человеку нужно узнать ID записи,которая была вставлена командой Insert.
И что неправильно в моем запросе ???
← →
msguns © (2005-04-29 15:39) [50]>Stanislav © (29.04.05 15:33) [49]
>Я так понимаю человеку нужно узнать ID записи,которая была вставлена командой Insert.
Если бы вопрос стоял так, то исчерпывающий ответ дан в [5]. А дальше обсуждалась еще пущенная мною (а зря) идея о получении ID до вставки и даже без. Просто это довольно часто поднимаемая трабла, единого решения которой до сих пор нет, как вариант почитай посты Max Zyuzin ©
← →
ANB © (2005-04-29 15:52) [51]
> идея о получении ID до вставки и даже без.
- у меня есть на идея :))) Переходи на Oracle. Там сиквенсы есть. И никаких проблем.
← →
Stanislav © (2005-04-29 15:53) [52]Ну, вот. А я давал ответ на вопрос поставленный ST см. [38],
как альтернатива [5]. Если это будет выполнятся одной х.п.,то 100% он узнает правильный ID.
А остальное уже отклонение от темы. А появление Polevi в этой ветке вообще глупо.
← →
Max Zyuzin © (2005-04-29 15:58) [53]Ну вы еще подеритесь...
>Stanislav © (29.04.05 15:53) [52]
Конструкция типа [40] не верна упринципе идеологически, ибо MSSQL это вам не однопользовательский парадокс.
← →
Polevi © (2005-04-29 16:03) [54]>Max Zyuzin © (29.04.05 15:58) [53]
г. Stanislav © имеет большой опыт работы с сервером от Microsoft
после >Stanislav © (29.04.05 14:36) [40] рождается миф от msguns "Тяжела как беременная свинья, что в инстале, что в работе"
← →
Stanislav © (2005-04-29 16:06) [55]Также как и [5].
Зачем узнавать значение ID до ?
← →
msguns © (2005-04-29 16:09) [56]>Max Zyuzin © (29.04.05 15:58) [53]
>это вам не однопользовательский парадокс.
Ой ля-ля ?
← →
msguns © (2005-04-29 16:12) [57]>Polevi © (29.04.05 16:03) [54]
>рождается миф от msguns "Тяжела как беременная свинья, что в инстале, что в работе"
Если б миф..
>Stanislav © (29.04.05 16:06) [55]
>Также как и [5].
>Зачем узнавать значение ID до ?
В принципе незачем. Если можно узнать ВМЕСТЕ. Я, к примеру, этого не знал ;(
← →
Max Zyuzin © (2005-04-29 16:12) [58]>msguns © (29.04.05 16:09) [56]
Ой ля ля :). Имелось ввиду вариант работы одним единсвенным пользователем.
← →
Max Zyuzin © (2005-04-29 16:14) [59]>Stanislav © (29.04.05 16:06) [55]
Что бы вставлять например записи в master-detail в одной транзакции.
← →
Stanislav © (2005-04-29 16:21) [60]msguns © (29.04.05 16:12) [57]
Если б миф..
Каждому решению должна быть алтернатива.
И кто сказал что Max(id) будет работать медленее или отнимать больше ресурсов ?
Max Zyuzin © (29.04.05 16:14) [59]
Begin Transaction
--master
Insert...
@NEWID = ...
--detail
insert @newid...
...
...
Commit Transaction / rollback transaction
← →
msguns © (2005-04-29 16:23) [61]>Stanislav © (29.04.05 16:21) [60]
Стас, да идея-то ясна ! Чего уж жевать ?
Думаю, что Макс уж сам сообразит-то ;))
← →
Stanislav © (2005-04-29 16:34) [62]Я все равно не пойму кому нужно узнавать значение AI до...
Ну, допустим ты его узнал, получил и что дальше, а если в этот момент кто-то вставил новую запись в таблицу ?
..ибо MSSQL это вам не однопользовательский парадокс (Max Zyuzin ©
)
← →
ANB © (2005-04-29 16:38) [63]Stanislav © (29.04.05 16:34) [62] - узнавать ID до вставки - общепринятая практика, я сам так в Oracle частенько делаю. Только тогда нужно юзать сиквенсы или использовать способ msguns, если сиквенсы сервер не поддерживает. И в этом случае, если кто то инсертит паралельно запись в нашу таблицу, он получит другой ID. А вот твоя идея с max привет к одному ID или, что еще хуже, ты получишь не свой. Max прокатит, только если ты уверен, что работаешь один.
← →
msguns © (2005-04-29 16:42) [64]>ANB © (29.04.05 16:38) [63]
>Max прокатит, только если ты уверен, что работаешь один.
Ты не понял Стаса. Он сначала вставляет запись, а потом узнает ID. Просто вместо @@identity опрашивает max. Если это в одной транзакции, то рез-т одинаковый.
← →
ANB © (2005-04-29 16:48) [65]И такой же шустрый ?
← →
msguns © (2005-04-29 16:55) [66]Сильно сомневаюсь, хотя черт его знает
Всем спасибо за весьма содержательную беседу. Особый респект ANB © . Жаль, что так и не дождался ответа Полевого.
Пошел праздновать, чего и вам желаю ;))
← →
Stanislav © (2005-04-29 16:57) [67]msguns © (29.04.05 16:42) [64] - Правильно.
ANB © (29.04.05 16:38) [63]
Не хочу морочить тебе голову, но можно пример где может понадоится узнать ID до вставки ?
← →
ANB © (2005-04-29 17:19) [68]Элементарно, Ватсон. Ты выводишь форму для новой накладной. И хочешь, чтобы на ней уже был номер. А его тебе разрешили генерить из ID с дырками, лишь бы был разный.
← →
Fay © (2005-04-29 17:26) [69]Мыши плакали...
Страницы: 1 2 вся ветка
Форум: "Базы";
Текущий архив: 2005.06.06;
Скачать: [xml.tar.bz2];
Память: 0.62 MB
Время: 0.035 c