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

Вниз

Уникальный ключ позволяет добавить дублирующиеся значения   Найти похожие ветки 

 
Sergey Ivanov   (2006-03-07 12:07) [0]

Уникальный ключ позволяет добавить дублирующиеся значения.

Как такое может быть?

Воспроизвести на тестовой базе не могу, а у пользователей постоянно проблемы.

С уважением Иванов Сергей.


 
Sergey13 ©   (2006-03-07 12:10) [1]

2Sergey Ivanov   (07.03.06 12:07)
>Уникальный ключ позволяет добавить дублирующиеся значения.
Да ладно гнать то. 8-)

>IB6.x
выкинь его нафики поставь FireBird


 
Sergey Ivanov   (2006-03-07 12:17) [2]

Sergey13 ©   (07.03.06 12:10) [1]
Да какое гнать - упарился уже.

В базу закачивается справочник чого-то там. возможно в источнике записей и есть такие дублирующиеся значения, но как они остаются в базе - не понятно, а на следующий раз Update failed и все.


 
Плохиш ©   (2006-03-07 12:20) [3]


> Sergey Ivanov   (07.03.06 12:07)  
> Уникальный ключ позволяет добавить дублирующиеся значения.

Это уже неуникальный ключ.


 
Desdechado ©   (2006-03-07 12:21) [4]

порченый индекс - backup-restore поможет


 
Sergey13 ©   (2006-03-07 12:23) [5]

2[2] Sergey Ivanov   (07.03.06 12:17)
>В базу закачивается справочник чого-то там
А индексы при этом не отключаются случаем?


 
Sergey Ivanov   (2006-03-07 12:31) [6]

Desdechado ©   (07.03.06 12:21) [4]
Не поможет. Не восстановиться.
gbak: ERROR: attempt to store duplicate value (visible to active transactions) in unique index "RDB$PRIMARY22"
gbak: Index "RDB$PRIMARY22" failed to activate because:
gbak:   The unique index has duplicate values or NULLs.
gbak:   Delete or Update duplicate values or NULLs, and activate index with
gbak:   ALTER INDEX "RDB$PRIMARY22" ACTIVE;


Я что то не так делаю, а что не пойму. Как такое получить программно? Индексы не отключаются, транзакции используются явно.

Как можно перестроить индексы по всем таблицам при старте программы?


 
Sergey13 ©   (2006-03-07 12:40) [7]

2[6] Sergey Ivanov   (07.03.06 12:31)
>Как можно перестроить индексы по всем таблицам при старте программы?
Не надо этого делать.
Надо проверить программу закачки "справочника чого-то там".
В работающей базе удали ключ. Найди дубликаты и грохни их по альтернативным ключам (возможно для этого придется создать временный первичный ключ). Восстанови ключ.
Я бы наверное пошел по такому пути. Естественно запасся бы страховочными копиями (файловое копирование с отключенным сервером).


 
Sergey Ivanov   (2006-03-07 12:52) [8]

Лечить я уже научился :-)
Программа закачки моя. Все просто до безобразия.

Хочется не попадать в дальнейшем. А не понимаю как такое может быть.


     with dbfBarcodes do begin
       FilePath := ImpDir;
     end;
     with ibqLBarcodes.Transaction do begin
       if Active then
         Rollback;
       StartTransaction;
     end;
     ibqLBarcodes.Open;
     with dbfBarcodes do begin
       Open;
       RowsDone := 0;
       RowsTotal := RecordCount;
       First;
       while not Eof do begin
         if ibqLBarcodes.Locate("BRC_CODE",dbfBarcodesBRC_CODE.AsString,[]) then begin
           ibqLBarcodes.Edit
         end else begin
           ibqLBarcodes.Append;
         end;
           ibqLBarcodesBRC_KRD_ID.AsInteger := dbfBarcodesBRC_KRD_ID.AsInteger;
           ibqLBarcodesBRC_CODE.AsString := dbfBarcodesBRC_CODE.AsString;
           ibqLBarcodesBRC_USER.AsInteger := dbfBarcodesBRC_USER.AsInteger;
           ibqLBarcodesBRC_STG_ID.AsInteger := dbfBarcodesBRC_STG_ID.AsInteger;
           ibqLBarcodesBRC_ACTIVE.AsInteger := 1;
           //MainForm.StatusShow(ibqLBarcodesBRC_CODE.AsString);
         ibqLBarcodes.Post;
         Next;
         RowsDone := RowsDone + 1;
         Gauge1.Progress := round(RowsDone / RowsTotal * 100);
         Application.ProcessMessages;
       end;
     end;
     with ibqLBarcodes.Transaction do begin
       if Active then
         Commit;
     end;


 
Desdechado ©   (2006-03-07 12:55) [9]

Sergey13 ©   (07.03.06 12:23) [5]
в IB нельзя его отключить
а даже если б можно было, его потом ведь не включишь из-за дублей


 
Sergey13 ©   (2006-03-07 13:00) [10]

2 [9] Desdechado ©   (07.03.06 12:55)
Просто другого способа получить дубли в ПК я не придумал. 8-)


 
Sergey13 ©   (2006-03-07 13:06) [11]

2[8] Sergey Ivanov   (07.03.06 12:52)
А что в эих полях ПК? BRC_KRD_ID или BRC_CODE?


 
Sergey Ivanov   (2006-03-07 13:16) [12]

Конечно BRC_CODE


 
Desdechado ©   (2006-03-07 13:19) [13]

есть подозрения, что автор ковыряется в системных таблицах при "заливке"


 
Sergey Ivanov   (2006-03-07 13:28) [14]

Автор -  я. Не ковыряюсь. Процедура ВСЯ выше.

запрос в ibqLBarcodes
select
BRC_KRD_ID,
BRC_CODE,
BRC_TIMESTAMP,
BRC_STG_ID,
BRC_USER,
BRC_ACTIVE
from
BARCODES
order by
 BRC_CODE;


updatesql:


update BARCODES
set
 BRC_KRD_ID = :BRC_KRD_ID,
 BRC_CODE = :BRC_CODE,
 BRC_TIMESTAMP = :BRC_TIMESTAMP,
 BRC_STG_ID = :BRC_STG_ID,
 BRC_USER = :BRC_USER,
 BRC_ACTIVE = :BRC_ACTIVE
where
 BRC_CODE = :OLD_BRC_CODE

insert into BARCODES
 (BRC_KRD_ID, BRC_CODE, BRC_TIMESTAMP, BRC_STG_ID, BRC_USER,
BRC_ACTIVE)
values
 (:BRC_KRD_ID, :BRC_CODE, :BRC_TIMESTAMP, :BRC_STG_ID, :BRC_USER,
:BRC_ACTIVE)


 
Desdechado ©   (2006-03-07 13:38) [15]

значит, исходная БД перед заливкой в нее уже с порченым индексом, который не может отследить дубли


 
Sergey Ivanov   (2006-03-07 13:52) [16]

А если перед заливкой пересоздавать таблицы, это дурной тон?


 
Sergey13 ©   (2006-03-07 16:00) [17]

2[16] Sergey Ivanov   (07.03.06 13:52)
Любой DDL в программе - это уже не хорошо.


 
Sergey Ivanov   (2006-03-07 16:44) [18]

В общем то, я так и думал, надеялся только, что мне скажут, что это всё фигня... :-)

Но, всё равно спасибо!



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2006.04.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.01 c
2-1145006301
031178
2006-04-14 13:18
2006.04.30
Delphi + Access


2-1144989813
alk
2006-04-14 08:43
2006.04.30
работа с ini файлом


3-1141905472
Xmen
2006-03-09 14:57
2006.04.30
Запрос к базе.


2-1144915498
elfebet
2006-04-13 12:04
2006.04.30
Может ли программа удалить сама себя?


2-1144922008
Роман87
2006-04-13 13:53
2006.04.30
"swf" файлы





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