Форум: "Базы";
Текущий архив: 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 ?
Страницы: 1 2 вся ветка
Форум: "Базы";
Текущий архив: 2005.06.06;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.013 c