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

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
SEGA
Сообщения: 5
Зарегистрирован: 13 дек 2007, 09:10

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

Сообщение SEGA » 29 янв 2008, 10:25

Итак, есть таблица такой структуры:

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

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

SEGA
Сообщения: 5
Зарегистрирован: 13 дек 2007, 09:10

Сообщение SEGA » 29 янв 2008, 10:27

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

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 29 янв 2008, 10:48

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

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 29 янв 2008, 10:56

попробуй запрос

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

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

SEGA
Сообщения: 5
Зарегистрирован: 13 дек 2007, 09:10

Сообщение SEGA » 29 янв 2008, 13:02

ну да, спс большое, теперь буду знать...

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 29 янв 2008, 15:30

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

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 29 янв 2008, 16:28

Если я не ошибаюсь, то уникальность PK проверяется только по индексу. Т.е. запись искать бесполезно, а индекс надо перестраивать в любом случае.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 29 янв 2008, 18:25

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

Ответить