Форум: "Базы";
Текущий архив: 2002.08.15;
Скачать: [xml.tar.bz2];
ВнизЧто за ошибка Key Violation в БД Paradox Найти похожие ветки
← →
KIR (2002-07-25 13:48) [0]Народ, что такое сабж и как от него избавляться, а то у меня периодически такое случается. И после этого невозможно вносить записи в таблицу. Слава богу, что я базу каждый день копирую, но все же...
← →
kaif (2002-07-25 13:52) [1]А можно подробнее? Как выражается то, что
>после этого невозможно вносить записи в таблицу
← →
Anatoly Podgoretsky (2002-07-25 13:53) [2]Поле уникальное ли какие другие ограничения
← →
KIR (2002-07-25 14:01) [3]Все происходит следующим образом: приложение работает совершенно нормально, т.е. вносит-изменяет-удаляет записи в таблицах БД. Потом без всяких видимых причин при добавлении очередной (кстати 601 по счету) записи выдается сообщение "Key Violation". И все...
← →
kaif (2002-07-25 14:03) [4]Дело в том, что в BDE есть ошибка.
1.Если нарушить уникальность.
2.Затем сделать SQL-запрс.
3.Затем еще раз нарушить уникальность.
То у Paradox таблицы разрушается индекс (index out of date).
Эта ошибка есть в D3,D4,D5,D6.
Я поэтому с Paradox не работаю.
← →
kaif (2002-07-25 14:06) [5]В принципе, после key violation ничего особого происходить не должно.
Что значит "и все" ?
Программа виснет, база потом не откывается (если да, то что при этом сообщается) и т.д...?
Ну нельзя так абстрактно вопросы задавать!
← →
Lord Warlock (2002-07-25 14:07) [6]
> kaif © (25.07.02 14:03)
Надо не нарушать уникальность
> KIR © (25.07.02 14:01)
Переиндексируй таблицу
← →
kaif (2002-07-25 14:23) [7]>Lord Warlock © (25.07.02 14:07)
>> kaif © (25.07.02 14:03)
>Надо не нарушать уникальность
Как это???
← →
Lord Warlock (2002-07-25 14:29) [8]
> kaif © (25.07.02 14:23)
Программа не должна нарушать уникальность и целостность БД. Ошибки могут возникать если например отрубили свет. В таком случае надо автоматом запускать переиндексацию, тогда всем будет хорошо.
← →
Lusha (2002-07-25 14:34) [9]>Lord Warlock © (25.07.02 14:29)
Не всегда... Иногда не успевает прописаться новое значение автоинкрементного ключа в заголовок таблицы... Тогда даже при рабочих индексах имеем Key violation при добавлении записи...
← →
Anatoly Podgoretsky (2002-07-25 14:42) [10]Это точно такое же уникальное поле, только ситуацию усугубляет то, что оно обабатывается автоматически, и тут уже не обойдешь дав новое значение, как в обычном случае.
Парадокс на то Парадокс.
Главный парадокс что он как то еще и работает иногда.
Здесь очень абстрактный вопрос, у меня что то не работает и полное нежелание привести подробности, поля, индекксы, сетевая или локальная база, поддается ли ремонту и т.д.
Ну нельзя так абстрактно вопросы задавать!
← →
kaif (2002-07-25 15:02) [11]> Lord Warlock © (25.07.02 14:29)
> kaif © (25.07.02 14:23)
> Программа не должна нарушать уникальность и целостность БД
Ключи на то исуществуют, чтобы не нарушать целостность. Key Violation - сообщение о попытке такого нарушения. Что-то я в толк не возьму, что Вы имеете в виду. Чтобы я сказал юзеру "Не нарушай уникальность, а то key violation будет"? Paradox защищает целостность с помощью этой исключительной ситуации. А то, что 2 попытки нарушить key и запрос между ними разрушают базу - это баг, который логически обойти невозможно в принципе, не отказавшись от использования Local SQL в Paradox.
← →
Lord Warlock (2002-07-25 15:06) [12]
> Lusha © (25.07.02 14:34)
Надо делать свой механизм автоинкрементного ключа
> kaif © (25.07.02 15:02)
повторяю еще раз, программа должна быть написана так, чтобы пользователь не смог нарушить уникальность ключа. Пользователь вообще не знает ничего про этот ключ, поэтому ему наплевать что там нарушилось. Необходимо предусмотреть "защиту от дурака".
← →
kaif (2002-07-25 15:21) [13]>2 Lord Warlock © (25.07.02 15:06)
А я и не говорю про автоинкремент.
По-вашему, в Paradox таблице вообще не нужны никакие уникальные индексы? Пускай все приложение делает? А если много юзеров, а если уникальность, это номер, например, введенного счета-фактуры?
И вообще я работаю с клиент-серверными базами. Там нарушение ключа - всегда дело сервера, а не приложения. Иначе вообще не нужны были бы все эти индексы...
Боюсь, что Вы зря настаиваете на своем подходе. Я говорил о баге, который есть в BDE и который в упор никто не хочит исправить. А в результате только и слышишь: "Парадокс - ненадежная база". А баг очень простой и мало заметный. И его нужно исправить, а не обходить. Без него Paradox - прекрасная СУБД.
← →
KIR (2002-07-26 11:21) [14]Народ, извините, что не дал все подробности, о которых вы просите. Я просто не ожидал такой бурной дискусси на данную тему. Но, честно говоря разъяснять-то особо и нечего. BDE выдает сообщение "Key Violation" и отказывается добавлять запись в таблицу. Вот принципе и все. Вот еще, кстати, при использовании DataBase DeskTop"a после данной ситуации как-то странно себя вело значение в автоинкрементном поле, т.е. обычно, когда вы добавляете запись (просто нажимаете стрелку "вниз" находясь на последней строчке таблицы в DataBase DeskTop"e), то в автоикрементном поле очередной записи сразу добавляется очередное значение - в моем случае такого не случалось.
И второй вопрос: я не очень давно занимаюсь БД, поэтому не понимаю выражения "переиндексировать таблицу". Как это делается.
← →
kaif (2002-07-26 12:06) [15]Переиндексировать - это удалить имеющийся индексный файл и вместо него создать новый.
Индексный файл это, грубо говоря, упорядоченный список ссылок на номера записей, причем список, упорядоченный по значениям какой-то группы полей. Индексный файл позволяет СУБД путем деления диапазонов пополам быстро находить запись по значению в ключевом поле, например, в таблице в миллион записей можно найти любую запись за 20 шагов.
Для переиндексации компонент TTable имеет свойство IndexDefs, имеющее соответствующие методы. Почитай Help. Там, кажется, были примеры того, как создать индекс заново.
← →
Weare (2002-07-26 12:07) [16]Например, в твоем же desktop"e открыть таблицу и поставить внизу галочку Pack Table, или просто пересоздать индексы.А можно и програмно:
Table.Exclusive:=True;
Table.Open;
Check(dbiRegenIndexes(Table.Handle));
← →
KIR (2002-07-26 12:41) [17]Еще вопрос - у меня в БД достаточно много перексрестных ссылок (насколько я понимаю, это то же самое что и внешний ключ). Так вот из-за этого к некоторым таблицам невозможно добавлять поля. Paradox пишет, что "detail table exists". В DBDeskTop"e убираю все Referential Integrity - пишет то же самое. В итоге я вообще отказался от применения внешних ключей в БД. Т.е. не совсем отказался. Я просто не устанавливаю связи через Referential Integrity в DBDeskTop"e. Правильно я делаю?
← →
Mike Kouzmine (2002-07-26 12:43) [18]Конечно правильно.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.08.15;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.006 c