Страница 1 из 1

Не пойму почему не работает двойной ключ

Добавлено: 29 янв 2008, 10:25
SEGA
Итак, есть таблица такой структуры:

Код: Выделить всё

CREATE TABLE GLOBAL_SPR (
    SPR_ID   INTEGER NOT NULL,
    ITEM_ID  INTEGER NOT NULL,
    NAME     CHAR(255) CHARACTER SET NONE
);
в ней ключ:

Код: Выделить всё

GLOBAL_SPRPRIMARYKEY1 PRIMARY KEY (SPR_ID, ITEM_ID);
собственно проблема в следующем:
вот этот запрос не возвращает ни одной строки:

Код: Выделить всё

select * from GLOBAL_SPR where ITEM_ID=5807;
а вот этот вызывает ошибку уникального ключа:

Код: Выделить всё

Insert Into Global_Spr ( SPR_ID, Item_Id , Name) Values ( 8, 5807, 'qwer');
object columns are
constrained - no 2 table rows can have duplicate column values

Добавлено: 29 янв 2008, 10:27
SEGA
забыл сказать что используется старый добрый IB 5.6.
возможно в этой таблице когда-то было такое значение, но оно удалено было перед вставкой. единственная мысль приходит, что значение ключа где-то сохранилось.

Добавлено: 29 янв 2008, 10:48
WildSery
Возможно, у тебя уже есть вставленное, но не закомиченное такое значение в другой транзакции. Потому select * не видит.

Добавлено: 29 янв 2008, 10:56
kdv
попробуй запрос

Код: Выделить всё

select * from GLOBAL_SPR where ITEM_ID+0=5807;
если он вернет искомую запись, значит индекс по item_id битый, надо делать b/r (с сохранением ориг. базы).

Добавлено: 29 янв 2008, 13:02
SEGA
ну да, спс большое, теперь буду знать...

Добавлено: 29 янв 2008, 15:30
WildSery
Вот блин, даже написал про индекс, но подумал, раз автор только PK указал... И стёр.
У тебя телепатор помехи лучше отсеивает :roll:

Добавлено: 29 янв 2008, 16:28
Dimitry Sibiryakov
Если я не ошибаюсь, то уникальность PK проверяется только по индексу. Т.е. запись искать бесполезно, а индекс надо перестраивать в любом случае.

Добавлено: 29 янв 2008, 18:25
WildSery
Dimitry Sibiryakov писал(а):Если я не ошибаюсь, то уникальность PK проверяется только по индексу. Т.е. запись искать бесполезно, а индекс надо перестраивать в любом случае.
Да. Но если запись есть, PK правильный, а сломан только другой индекс, по ITEM_ID, то перестраивать нужно его, а не PK ;)