Главная страница
    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.47 MB
Время: 0.052 c
1-1142426693
ilkz
2006-03-15 15:44
2006.04.16
Как вывести в StringGrid греческий символ?


6-1136500651
GanibalLector
2006-01-06 01:37
2006.04.16
WSA.Listen


3-1140436744
PSZ
2006-02-20 14:59
2006.04.16
Сделать мониторинг таблицы, с которой работает другое приложение


5-1129377067
gde11
2005-10-15 15:51
2006.04.16
Не показываются в Instectore свойства внутреннего компонента.


2-1143773415
Barabashka
2006-03-31 06:50
2006.04.16
Небольшая проблема





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