Форум: "Базы";
Текущий архив: 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]Автор - я. Не ковыряюсь. Процедура ВСЯ выше.
запрос в ibqLBarcodesselect
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