Форум: "Базы";
Текущий архив: 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