![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли узнать значение ключевого поля до добавления записи в та [D6, Paradox]
Mishenka © (2006-02-20 16:10:00)Можно ли узнать значение ключевого поля до добавления записи в таблицу?
Хочу добавить запись, которая бы ссылалась сама на себя, но так как значение ключевого поля присваивается автоматически после добавления записи, то незнаю какое значение указать в поле ссылке. Как быть?
ЮЮ (2006-02-21 02:53:00) [1]Я в парадоксе делал иначе, без доп.таблиц:
1) на клиенте получал эмпирическое значение следующего знвчения ключа (не инкремента, естественно: Select Max(id)+1 from table
2) пытался вставить запись. При исключении снова получал ожидаемое значение ключа. Если оно отличалось от того, что пытался встановить в первый раз, брал его и опять пытался вставить. Если же при исключении новое и первоначальное значения совпадали, значит ошибка была из-за других причин.
З.Ы. Естественно, про запросы типа
INSET INTO table SELECT ... FROM
придется забыть.
Жуков Олег (2006-02-21 02:41:00) [2]Нельзя, если оно автоматически формируется. Но если очень хочется, то можно. Надо отказаться от автоматического инкремента и реализовать похожий механизм самому.
Технология такая - на сервере базы данных делается счётчик (генератор уникальных значений) (Сразу оговорюсь, функции сервера базы данных, в случае с парадоксом могут быть реализованы и в клиентской программаме, важно чтобы эта одинаковая серверная функциональность была встроена во все клиенты.). Особенность счётчика должна быть такая - однажды полученное из него значение никогда не должно быть выдано снова (это необходимое условие для корректной работы нескольких пользователей).
Перед сохранением добавляемой записи программа-клиент должна получить это новое значение счётчика, сама же вставить его в запрос Insert, и, затем использовать его для других своих целей, например можно создать привязанные записи в подчиненных таблицах. При этом на trigger on insert (в случае с SQL сервером) можно выполнять проверку - если ключевое поле пустое, то заполнять его из этого же счётчика. Счётчик можно сделать добавив ещё одну таблицу в базу, для хранения последнего значения, написав процедуру из двух-трёх SQL, и установив соглашение, что любое добавление в таблицу должно проходить только используя значения ключа, полученное этой процедурой. Алгоритм процедуры может быть например таким:
Блокируем таблицу Counter и на запись и на чтение
Читаем значение из Таблицы Counter
Прибавляем к нему 1 и записываем снова в таблицу (это и есть новое значение ключа)
Вернуть новое значение для ключа
Разблокировать таблицу
Anatoly Podgoretsky (2006-02-20 23:41:00) [3]Нельзя, до добавления это еще не существует.
Виталий Панасенко (2006-02-20 18:03:00) [4]
> msguns © (20.02.06 17:46) [3]
> >Mishenka (20.02.06 16:10)
> >Можно ли узнать значение ключевого поля до добавления записи
> в таблицу?
>
> В общем случае для парадокса - нет.
> Для локального "варианта" есть шанс "угадать" с помощью
> запроса
> Select Max(id)+1 from table
Для Paradox - не катит. Добавил запись, удалил. Уже ID будет равно Max(ID)+2
Ega23 (2006-02-20 17:49:00) [5]
> Select Max(id)+1 from table
>
Это только если там что-то есть... :о)
msguns (2006-02-20 17:46:00) [6]>Mishenka (20.02.06 16:10)
>Можно ли узнать значение ключевого поля до добавления записи в таблицу?
В общем случае для парадокса - нет.
Для локального "варианта" есть шанс "угадать" с помощью запроса
Select Max(id)+1 from table
Виталий Панасенко (2006-02-20 17:29:00) [7]Да, как получит то, чего еще нет (в данном варианте. Не берем генераторы в рассчет)? Оригинальный вопрос...
Ega23 (2006-02-20 16:11:00) [8]
> Хочу добавить запись, которая бы ссылалась сама на себя
Нереально.
Определяй поле как null, вставляй запись, получай id, потом - update