Запросы, планы, оптимизация запросов, ...
Модераторы: 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 указал... И стёр.
У тебя телепатор помехи лучше отсеивает

-
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
