Форум: "Базы";
Текущий архив: 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