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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.038 c
1-1141998060
MixAnOL
2006-03-10 16:41
2006.04.16
DoubleBuffered:=true


4-1138572095
Vitaly Grobshtein
2006-01-30 01:01
2006.04.16
Управление фотоаппаратом


15-1143462967
stone
2006-03-27 16:36
2006.04.16
Работа и жизнь...


15-1143267479
kilonet
2006-03-25 09:17
2006.04.16
Как обмениваться большими файлами


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