Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.16;
Скачать: CL | DM;

Вниз

Можно ли узнать значение ключевого поля до добавления записи в та   Найти похожие ветки 

 
Mishenka   (2006-02-20 16:10) [0]

Можно ли узнать значение ключевого поля до добавления записи в таблицу?
Хочу добавить запись, которая бы ссылалась сама на себя, но так как значение ключевого поля присваивается автоматически после добавления записи, то незнаю какое значение указать в поле ссылке. Как быть?


 
Ega23 ©   (2006-02-20 16:11) [1]


> Хочу добавить запись, которая бы ссылалась сама на себя


Нереально.

Определяй поле как null, вставляй запись, получай id, потом - update


 
Виталий Панасенко   (2006-02-20 17:29) [2]

Да, как получит то, чего еще нет (в данном варианте. Не берем генераторы в рассчет)? Оригинальный вопрос...


 
msguns ©   (2006-02-20 17:46) [3]

>Mishenka   (20.02.06 16:10)  
>Можно ли узнать значение ключевого поля до добавления записи в таблицу?

В общем случае для парадокса - нет.
Для локального "варианта" есть шанс "угадать" с помощью запроса
Select Max(id)+1 from table


 
Ega23 ©   (2006-02-20 17:49) [4]


> Select Max(id)+1 from table
>


Это только если там что-то есть...   :о)


 
Виталий Панасенко   (2006-02-20 18:03) [5]


> msguns ©   (20.02.06 17:46) [3]
> >Mishenka   (20.02.06 16:10)  
> >Можно ли узнать значение ключевого поля до добавления записи
> в таблицу?
>
> В общем случае для парадокса - нет.
> Для локального "варианта" есть шанс "угадать" с помощью
> запроса
> Select Max(id)+1 from table

Для Paradox - не катит.  Добавил запись, удалил. Уже ID будет равно Max(ID)+2


 
Anatoly Podgoretsky ©   (2006-02-20 23:41) [6]

Нельзя, до добавления это еще не существует.


 
Жуков Олег   (2006-02-21 02:41) [7]

Нельзя, если оно автоматически формируется. Но если очень хочется, то можно. Надо отказаться от автоматического инкремента и реализовать похожий механизм самому.

Технология такая - на сервере базы данных делается счётчик (генератор уникальных значений) (Сразу оговорюсь, функции сервера базы данных, в случае с парадоксом могут быть реализованы и в клиентской программаме, важно чтобы эта одинаковая серверная функциональность была встроена во все клиенты.). Особенность счётчика должна быть такая - однажды полученное из него значение никогда не должно быть выдано снова (это необходимое условие для корректной работы нескольких пользователей).
Перед сохранением добавляемой записи программа-клиент должна получить это новое значение счётчика, сама же вставить его в запрос Insert, и, затем использовать его для других своих целей, например можно создать привязанные записи в подчиненных таблицах. При этом на trigger on insert (в случае с SQL сервером) можно выполнять проверку - если ключевое поле пустое, то заполнять его из этого же счётчика. Счётчик можно сделать добавив ещё одну таблицу в базу, для хранения последнего значения, написав процедуру из двух-трёх SQL, и установив соглашение, что любое добавление  в таблицу должно проходить только используя значения ключа, полученное этой процедурой. Алгоритм процедуры может быть например таким:

Блокируем таблицу Counter и на запись и на чтение
Читаем значение из Таблицы Counter
Прибавляем к нему 1 и записываем снова в таблицу (это и есть новое значение ключа)
Вернуть новое значение для ключа
Разблокировать таблицу


 
ЮЮ ©   (2006-02-21 02:53) [8]

Я в парадоксе делал иначе, без доп.таблиц:
1) на клиенте получал эмпирическое значение следующего знвчения ключа (не инкремента, естественно:  Select Max(id)+1 from table
2) пытался вставить запись. При исключении снова получал ожидаемое значение ключа. Если оно отличалось от того, что пытался встановить в первый раз, брал его и опять пытался вставить. Если же при исключении новое и первоначальное значения совпадали, значит ошибка была из-за других причин.

З.Ы. Естественно, про запросы типа
 INSET INTO table SELECT ... FROM
придется забыть.



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

Текущий архив: 2006.04.16;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.038 c
15-1143537417
vidiv
2006-03-28 13:16
2006.04.16
Что такое "Графо-манство"


10-1116735536
SnapIn
2005-05-22 08:18
2006.04.16
Прочитать переданные в TWebBrowser параметры


9-1127987214
XCoder
2005-09-29 13:46
2006.04.16
Вопрос по LightMaps (OpenGL)


3-1140548087
Варяг
2006-02-21 21:54
2006.04.16
Упаковка ADOTable


1-1142254492
Nibbler
2006-03-13 15:54
2006.04.16
Работа с содержимым ScrollBox