Главная страница
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.045 c
4-1138778434
Davinchi9
2006-02-01 10:20
2006.04.16
Как изменить положение ProgressBar в загрузчике ядра WinXP


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


2-1144048023
DVM
2006-04-03 11:07
2006.04.16
Потоки и Сокеты пара вопросов


15-1143184320
Sergey13
2006-03-24 10:12
2006.04.16
"Устами младенца" или "Говорят дети"


2-1143702326
thvfrjd
2006-03-30 11:05
2006.04.16
проблем с параметрами