Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
1-1116370001
jcrush
2005-05-18 02:46
2005.06.06
Картинка фоном в ListView - почему текст имеет не прозрачный фон?


14-1116403888
1008
2005-05-18 12:11
2005.06.06
Сеть.


1-1116600766
juice
2005-05-20 18:52
2005.06.06
Имя экземпляра класса


1-1116788754
Delcom
2005-05-22 23:05
2005.06.06
Как работать с таймером в Delphi 6???


14-1116641547
Jeka
2005-05-21 06:12
2005.06.06
Цифровой фотоаппарат





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский