|
1 / 1 / 0 Регистрация: 25.12.2010 Сообщений: 25 |
|
|
1 |
|
|
27.12.2011, 17:46. Показов 21924. Ответов 4
Подскажите, пожалуйста, кто знает. В БД при добавлении записи появляется ошибка Key Violation. Не могу установить причину её появления, ну и соответственно исправить.Причём самое интересное то, что первоначально всё работало нормально, а потом появилась эта ошибка. Я восстанавливал базу из архивной копии — ошибка пропадала, но потом опять появлялась. Использую BDE, таблицы Paradox. Заранее спасибо
__________________
0 |
|
1 / 1 / 0 Регистрация: 25.12.2010 Сообщений: 25 |
|
|
27.12.2011, 22:05 [ТС] |
2 |
|
PS: Есть такое предположение.База работает в сети.Скорее всего ошибка возникла из-за того, что таблицы в BDE автоматически не обновляются.Т.е. запись добавленная в одну и ту же таблицу на разных компах,наверное,имеет один ID (ID — первичный индекс,автоинкремент).Самое интересное то, что у меня на одном компе такая ошибка тоже была…
0 |
|
1 / 1 / 7 Регистрация: 28.06.2011 Сообщений: 342 |
|
|
28.12.2011, 10:07 |
3 |
|
Key violation — нарушение ключа.. Ты в поле(я), входяще в ПК (первичный ключ) пытаешься ввести одиноковое(ые) значение(я)..Если поле типа AutoInc, то вполне реально могла порушиться таблица и генерируется одно и тоже значение.. Самы просто йвариант — создать аналогичную таблицу где-то еще и перетянуть туда данные.. Хотя тут может быть проблем, если ID где-то используется как мастре-ключ…
0 |
|
1 / 1 / 0 Регистрация: 25.12.2010 Сообщений: 25 |
|
|
28.12.2011, 12:17 [ТС] |
4 |
|
А из-за чего может рухнуть таблица? Дело в том, что БД работает далеко от меня и люди, которые с ней работают ничего с ней не смогут сделать.Не могу же я каждый раз выезжать к ним или брать у них эти таблицы, чтобы их исправить.
0 |
|
1 / 1 / 7 Регистрация: 28.06.2011 Сообщений: 342 |
|
|
28.12.2011, 13:22 |
5 |
|
А из-за чего самолеты падают ? В настройках BDE-Local Share=True — ОБЯЗАТЕЛЬНО ! А рухнуть… Лепистричество вырубилось, комп повис в момент записи (значение счетчика в заголовке таблицы где-то лежит).. Да мало ли что…
0 |

Key violation или детские грабли
, Paradox/BDE
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
|
|
Full Member
Рейтинг (т): 11 |
Привет всем! —- |
|
Coala |
|
|
Цитата SilverShield @ 22.11.05, 07:23 стоят дополнительно компоненты Table с Exclusive=true
не совсем понятно… |
|
.DeV!L |
|
|
Full Member
Рейтинг (т): 11 |
Цитата SilverShield @ 22.11.05, 07:23 Работаю с таблицами через компоненту TQuery. Точнее у меня на каждую таблицу используется своя Query (так надо было: чтобы одновременно можно было наборы данных из разных таблиц в разных DBGrid смотреть, а через Query проще делать выборку по условиям). Запись новых строк делаю тоже через Query, но в следующей последовательности: создаю новый Query, выполняю insert для нужно таблицы, освобождаю Query. После, для связанного с таблицей Query делаю Close/Open. если ею пользуются много народу, то BDE отпдает автоматически, так как это не клиент серверная БД!!! тебе нада InterBase или что-то похожее…. а твой проект это не детские грабли….это МЕГА ГРАБЛИ!!!! Сообщение отредактировано: .DeV!L — 22.11.05, 08:21 |
|
SilverShield |
|
|
Full Member
Рейтинг (т): 11 |
Запись новых строк производится не в самой проге, а вынесена в dll, потому и производится динамически. Через ADO, на сколько я знаю, Парадокс извратно использовать. Добавлено 22.11.05, 08:35 |
|
Coala |
|
|
Цитата SilverShield @ 22.11.05, 08:29 Запись новых строк производится не в самой проге, а вынесена в dll, потому и производится динамически. А кто тебе мешает в длл-ке иметь квери и апдейт-скл, созданные в дизайне? |
|
SilverShield |
|
|
Full Member
Рейтинг (т): 11 |
Coala, согласен, можно и в дизайне. Попробую поставить TUpdateSQL, он вроде кэшировать запросы позволяет? |
|
Coala |
|
|
Цитата SilverShield @ 22.11.05, 08:29 Через ADO, на сколько я знаю, Парадокс извратно использовать.
Первый раз слышу Цитата SilverShield @ 22.11.05, 09:03 Попробую поставить TUpdateSQL, он вроде кэшировать запросы позволяет? Деталей не помню, но без него ты просто не создашь запрос на модификацию данных (в отличие от ADO). |
|
SilverShield |
|
|
Full Member
Рейтинг (т): 11 |
Цитата Coala @ 22.11.05, 09:12 Деталей не помню, но без него ты просто не создашь запрос на модификацию данных (в отличие от ADO).
update Table1 set Col2 = … where Col1 = … Все отлично работает и без TUpdateSQL
TUpdateSQL applies cached updates on behalf of queries or stored procedures that can’t post updates directly. Взято из хелпа к нему. Сообщение отредактировано: SilverShield — 22.11.05, 09:20 |
Bas |
|
|
А сколько записей в таблицах (чему равен максимальный id)? |
|
SilverShield |
|
|
Full Member
Рейтинг (т): 11 |
Не больше 6000. Поэтому вариант с переполнением я и исключил. |
|
H.Iglesias II |
|
|
Цитата Главное причину понять, тогда я ее как-нить уже поборю. попробуй удалить и создать заново их индексы |
|
Coala |
|
|
Цитата SilverShield @ 22.11.05, 07:23 Выдается ошибка «Key Violation». Полный текст сообщения можешь привести? |
|
SilverShield |
|
|
Full Member
Рейтинг (т): 11 |
Сообщение ошибки выглядит примерно так:
«Project PTest1.exe raised exception class EDBEngineError with message ‘Key violation’. Process stopped. … « Но это уже последствия, когда все запорчено и просто нельзя добавить новые записи. Добавлено 22.11.05, 10:38 |
Bas |
|
|
Цитата SilverShield @ 22.11.05, 10:36 через что пересоздание индексов делается?
DROP INDEX table_reference.index_reference | PRIMARY CREATE [UNIQUE] [ASC | DESC] INDEX index_reference ON table_reference (column_reference [,column_reference…]) |
|
SilverShield |
|
|
Full Member
Рейтинг (т): 11 |
Спасибо. Только дело в том что я из индексов использовал только первичный ключ (поставил на автоинкрементное поле). В хелпе Database Desktop нашел такую фразу: первичный индекс в Paradox может быть создан только через определение первичного ключа при создании таблицы. Получается единственное решение — это грохать таблицу и создавать ее заново? |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- Delphi: Базы данных
- Следующая тема
[ Script execution time: 0,0842 ] [ 16 queries used ] [ Generated: 29.01.23, 07:00 GMT ]
← →
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]
Конечно правильно.
![]()
![]()
-
darkdevill
- Сообщения: 2
- Зарегистрирован: 14 сен 2010, 12:28
Администратор результатов выдает ошибку key violation
При запуске Администратора результатов, выдается ошибка key violation, и отображается только часть результатов. результаты хранятся на сетевом ресурсе, одна папка для всех пользователей. В чём проблема?
-
Keepsoft
- Администратор
- Сообщения: 3648
- Зарегистрирован: 20 мар 2008, 18:03
- Контактная информация:
Re: Администратор результатов выдает ошибку key violation
Сообщение Keepsoft » 01 июн 2011, 13:21
darkdevill писал(а):При запуске Администратора результатов, выдается ошибка key violation, и отображается только часть результатов. результаты хранятся на сетевом ресурсе, одна папка для всех пользователей. В чём проблема?
Переиндексируйте базу данных. Для этого один раз запустите файл ReIndexBase.bat из папки Конструктора тестов.
Если не поможет, то обратитесь пожалуйста в службу тех. поддержки по e-mail:
support@keepsoft.ru
Вернуться в «Общие вопросы»
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость
Обсуждение программы Домашние финансы
|
|
|
|
|
|


Дублирование записей исключено (у меня автоинкрементное поле стоит), переполнение тоже быть не может. 

афтар выпей йаду!!!!


