Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.05.12;
Скачать: [xml.tar.bz2];

Вниз

ID только-что добавленой записи   Найти похожие ветки 

 
Silver_   (2003-04-21 09:47) [0]

Неужели для етого придется запрос писать типа

SELECT MAX(IDfld)+1 AS MaxID FROM Table1

другого более простого пути нету


 
Zacho   (2003-04-21 09:57) [1]

CУБД какая ?
И использовать SELECT MAX(IDfld)+1 AS MaxID FROM Table1 - верный способ получения конфликтов при многопользовательской работе.


 
Silver_   (2003-04-21 10:09) [2]

извеняюсь что сразу не указал Access


 
Silver_   (2003-04-21 11:04) [3]

Здесь кто-нить бывает Ауууууууууууууу!!!!!


 
Mike Kouzmine   (2003-04-21 11:07) [4]

Все в потрепаться сидят - пиписьками мерятся.


 
Соловьев   (2003-04-21 11:07) [5]


> SELECT MAX(IDfld)+1 AS MaxID FROM Table1
>
> другого более простого пути нету

для Access наверное нет...
Локально используется или как? Если многопользовательски, то

> Zacho © (21.04.03 09:57)



 
Sergey13   (2003-04-21 11:19) [6]

Если только что добавленой то
SELECT MAX(IDfld) AS MaxID FROM Table1


 
Anatoly Podgoretsky   (2003-04-21 13:47) [7]

И получите чужой номер.


 
AlexAlex   (2003-04-21 14:32) [8]

Произвести выборку по уникальному ключу этой таблицы для данной записи.


 
DarkGreen   (2003-04-21 14:40) [9]

ID - судя по всему и есть уникальный (точнее первичный) ключ для данной таблицы.

2 Silver_ © (21.04.03 09:47)
БД какая?


 
Соловьев   (2003-04-21 14:49) [10]


> Silver_ © (21.04.03 10:09)



 
Alexandr   (2003-04-21 14:56) [11]

эта, компоненты доступа какие?


 
Silver_   (2003-04-21 15:10) [12]


> Соловьев © (21.04.03 11:07)

в том то и дело многопользовательски
причем Zacho © (21.04.03 09:57) верно заметил

а как тогда быть???


> 2 Mike Kouzmine © (21.04.03 11:07)

с чего ты решил что тут потрепаться решили вопрос довольно-таки серьезный тебующий решения (причем не тока я один интересуюсь но пока ответа не нашел)


 
Mike Kouzmine   (2003-04-21 15:17) [13]

Я не решил, что вы тут треплетесь. Даже наоборот - с вниманием читаю этот пост. Просто не совсем понял проблему.
Как писал AlexAlex(21.04.03 14:32) без дополнительного уникального ключа задачу не решить.


 
Silver_   (2003-04-21 15:36) [14]


> Alexandr © (21.04.03 14:56)
> эта, компоненты доступа какие?


ADODataSet, DBGrid
хотел бы всю эту вставку через SQL да теперь хоть через Before/AfterPost тока странные ID выдает всегда один и тот-же

Table1.Post;
ShowMessage(Table1ID.AsInteger);

не пойму в чем трабл - то


P.S.

> Mike Kouzmine © (21.04.03 11:07)

не правельно понял :( извени, потому суда не заходят что в потрепаться сидать имелось введу, а я -то... :(


 
sniknik   (2003-04-21 15:57) [15]

Silver_ © (21.04.03 15:36)
> хотел бы всю эту вставку через SQL
можно заменить
SELECT MAX(IDfld)+1 AS MaxID FROM Table1

на
INSERT INTO ....
и собственно замена
SELECT @@IDENTITY AS MaxID

(думаю ID у тебя автоинкремент, иначе ты бы знал его значение и не понадобилось бы такого селекта)
но и в этом случае есть риск получить не свое значение (хотя меньше чем в твоем, т.к. должно быстрее отрабатывать).
а риск будет в любом случае т.к. Access не сетевая база. (переходи на SQL server)


 
Silver_   (2003-04-21 16:11) [16]

SELECT @@IDENTITY AS MaxID

кто такой @@IDENTITY
в результате получу "свежеиспеченный" ID?
типа так
INSERT INTO Table2
set fld1=...;

SELECT @@IDENTITY AS MaxID FROM Table2;

INSERT INTO Table1
set fld1=...,
fld_to_link_ID= MaxID

или вобще такой запрос

INSERT INTO Table2
set fld1=...;
INSERT INTO Table1
set fld1=...,
fld_to_link_ID= SELECT @@IDENTITY AS MaxID FROM Table2


я в ту степь поехал???


> (переходи на SQL server)

бос не хотять (платить не хочет вот и изварачиваться приходится)


 
Соловьев   (2003-04-21 16:15) [17]


> платить не хочет вот и изварачиваться приходится

linux+fb - бесплатно


 
Leran2002   (2003-04-21 16:42) [18]

Удалено модератором
Примечание: Прекрати матом крыть, здесь же дети малые


 
sniknik   (2003-04-21 16:45) [19]

> я в ту степь поехал???
примерно (SET в инсерте?)

@@IDENTITY - это последний автоинкремент (переменная Jet, MSSQL, может еще кого)

так сработает
1 команда
INSERT INTO Table2 (....) VALUES (.....)
2 команда
INSERT INTO Table1 (.....,fld_to_link_ID) VALUES (.....,@@IDENTITY)
(пакетом (в 2 запроса в 1 команде) как ты написал не пройдет, не MSSQL)

кстати бесплатных sql серверов действительно довольно много, чего изворачиватся? MSDE - (бесплатный MSSQL, не придется переделывать почти) вернее не бесплатный а с лицензией MSOffice (как и Access вроде).


 
Anatoly Podgoretsky   (2003-04-21 16:57) [20]

sniknik © (21.04.03 16:45)
M SDE не бесплатный, стоимость его входит в стоитмость офиса и лицензия для использования только в качестве Desktop .


 
AlexAlex   (2003-04-21 17:04) [21]

Можно еще поискать значение во внутренних структурах данных сервера. У Informix такое значение можно найти в структуре данных по ошибкам, если запись прошла нормально, но это не совсем хороший подход. А настоящий уникальный ключ (по смыслу) скорее всего должен все-таки быть, если его по смыслу нет, то возможно неправильно спроектирована таблица или БД.


 
Соловьев   (2003-04-21 17:08) [22]


> скорее всего должен все-таки быть, если его по смыслу нет,
> то возможно неправильно спроектирована таблица или БД.

Access - вот в чем трабл....


 
sniknik   (2003-04-21 17:10) [23]

Anatoly Podgoretsky © (21.04.03 16:57)
ну я почти это и написал примерно (точно что там и от чего смотреть влом).

можно считать его условно бесплатным (как почти все у нас ;о)) вот ведь Access используют? значит (если он "правильный") и MSDE имеют право. (если "неправильный" то и на это плевать)


 
Anatoly Podgoretsky   (2003-04-21 18:30) [24]

Если правильный и правильно, то не выйдет, многопользовательская база!
Если неправильный, то тут один вопрос, а может работать MSDE в качестве сервера? У меня просто нет информации.

Но всегда можно сделать правильным, существует достаточно большое количество беспратных SQL серверов.


 
sniknik   (2003-04-21 19:53) [25]

Anatoly Podgoretsky © (21.04.03 18:30)
> а может работать MSDE в качестве сервера? У меня просто нет информации.

в смысле, физически? может, на небольших обьемах (ограничение на базу 2гига как и у аксеса), по функционалу то же что MSSQL, если не сильно придираться, ограничения всетаки есть, ну к примеру "job-ы" можно только руками подымать, при старте системы SQL Server Agent не запускается (специально??) и еще чтото наверняка есть, сама база по структуре один в один от MSSQL делаеш DetachDB в MSDE и AttachDB к MSSQL (проходит на ура). В общем в любом случае лутше аксеса а в сети так вообще нет сравнения, до 5(обычно 3) клиентов работает без проблем (может и больше(пробовали) но тут уж политика "партии", ставим проги на нормальный)
(вся обсуждаемая "проблема" выльется в написание 1 пакета с транзакцией(если хочется) и т.д, выполняется одной командой, никаких колизий и т.п.).

а вот по лицензионности? (правовой возможности работать так) вот тут не знаю :о)) я не менеджер по продажам. но думаю можно, MSDE специально как конкурента бесплатным серверам запустили, лицензия то считай фиктивная (офис у всех есть, нет? :о)). привыкнеш там недалеко и до покупки, замануха ;о).


 
vuk   (2003-04-21 22:16) [26]

А вообще говоря, лучший способ - сгенерировать идентификатор вставляемой записи ещё до вставки. А то все эти Identity имеют свойство иногда сбиваться.


 
Polevi   (2003-04-22 10:34) [27]

>vuk © (21.04.03 22:16)
зависит от кривизны рук


 
Карелин Артем   (2003-04-22 11:05) [28]

А у меня в FB есть хранимая процедура для вставки записи в базу и одновременно получения ее идентификатора в качестве выходного параметра.


 
Duce   (2003-04-22 11:36) [29]

В главную тему. CurrVal рулит, спасибо Ораклу, а с появлением ретурнинга - 5+. Но коль уж IB. На Оракле режим по умолчанию Read Commited,
данные для транзакции фиксируются на момент начала. Таким образом, чужих она в процессе не увидит. Так что прокатит вариант с выборкой max(id), но старт/коммит вручную. На IB режим не такой же? Тогда вроде должно отработать с max(ID). Иначе донт ноу... Но вообще конечно эффективнее до вставки хватать id. если уж только id не суррогат, а сложносоставной с образованием в триггере(бывает и такое!), и прочие занудства - то увы%)...


 
Silver_   (2003-04-22 12:51) [30]

Спасобо за отзывы!

Проблему я решил, правда тупо выглядит
сделал через Before/AfterPost потому что в AfterPost уже известен ID, думаю в будущем переделать всю эту вставку через SQL потому что, притормаживает (стока .Post-ов пока..., а без них ID не известен :( ) ситуация типа:

1. Добавляю запись в Table1
1.1. Table1.Post
2. Добавляю запись в Table2
2.1. Table2.Post
3. Добавляю запись в Table3
3.1. Table3.Post

4. делаю связь Table3 и Table2
5. Добавляю запись в Table4
5.1. Делаю свази между Table1 и Table3 "свежих записей"
5.2. Table4.Post

P.S. может кто поймет че делаю :)
Структура БД может не идеальна но... такие вот связи.


 
AVR   (2003-04-22 14:56) [31]

Можно при вставке в таблицу указывать идентификатор сессии (что угодно - IP или случайное число + дата-время - придумать можно).
Затем выбирать максимальное ID с идентификатором сессии.
По хорошему, потом нужно поле идентификатора сессии опустошить
(ID ты уже знаешь), что бы не увеличивался индекс по полю ид.сессии.

Можно пользоваться уникальностью атрибутов объектов, сохраняемых в таблице (например в складе - номер накладной + год).


 
Silver_   (2003-04-22 15:16) [32]


> Можно пользоваться уникальностью атрибутов объектов

такие действительно есть, но можна нарваться на то что вдруг ошибутся (в один символ) в его написании, а тут окажится что такое есть (номер накладной), и произойдет привязка к другой накладной, потом отыскать где не сходятся концы думаю будет накладно, можно и временно вписывать Now; в какое-нить поле и... но думаю это примерно тоже что и AfterPost, да и поле специально тока для этого - накладно.


 
vuk   (2003-04-22 15:58) [33]

to Polevi:
>зависит от кривизны рук
Если бы. Сами нарвались на такое в MS SQL. Правда давно это было, но с тех пор доверия к Identity уже нет. Все идентификаторы генерятся вручную. Заодно и возможности на чужой идентификатор нарваться нет.


 
AME   (2003-04-22 17:03) [34]

Может быть bookmarks помогут делу?



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2003.05.12;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.007 c
14-34598
Ricks
2003-04-22 22:30
2003.05.12
Помогите найти песню!


1-34467
dimon1979
2003-04-28 13:21
2003.05.12
Указатели


6-34533
IL-89
2003-03-16 17:26
2003.05.12
Disconnect


3-34354
Askik
2003-04-18 15:44
2003.05.12
Как заставить ADOQuery не скачивать все записи набора данных?


14-34564
Vint45
2003-04-23 14:16
2003.05.12
Распределение элементов с учетом приоритетов





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский