Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.30;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.034 c
5-1130482196
Priest
2005-10-28 10:49
2006.04.30
Вложеное свойство типа компонент


8-1133365011
Yozj
2005-11-30 18:36
2006.04.30
микширование на лету


3-1140564295
TheEd
2006-02-22 02:24
2006.04.30
Как при вставке задать полям знач-я по умолч., те что в БД заданы


2-1145032642
Тимон
2006-04-14 20:37
2006.04.30
ошибка при работе с tstringlist & stringgrid


4-1139327559
abakh
2006-02-07 18:52
2006.04.30
OleContainer