Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Недостающие значения во внешних ключах / 3 сообщений из 3, страница 1 из 1
03.03.2009, 13:29
    #35848148
mwolf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Недостающие значения во внешних ключах
Уважаемые, я оказываюсь понимать происходящие и, поскольку в DB2 весьма новичёк, хотелось бы услышать ваше мнение.

Итак, сервер - Database server = DB2/LINUXX8664 8.2.9,
есть 2 таблицы Author и Person. Автор ссылается на Персону по полю person_id.
В комментариях после запроса - количество выданных строк или значение каунта, в зависимости от запроса.
Код: plaintext
1.
select COUNT(*) from author a --821
select COUNT(*) from person p -- 196 

Я отключаю внешний ключ и затем снова включаю его (я не знаю в каком состоянии был ключ до моих действий)
Код: plaintext
1.
 ALTER TABLE AUTHOR ALTER FOREIGN KEY SQL050915213038020 NOT ENFORCED
 ALTER TABLE AUTHOR ALTER FOREIGN KEY SQL050915213038020 ENFORCED
На включении лезет ошибка, что Автор ссылается на Персон, которых нет.

И я полез проверять
Код: plaintext
select COUNT(*) from author a LEFT outer JOIN person p ON a.PERSON_ID = p.person_id WHERE p.person_id IS NULL --  0 
Ух, ты - подумал я. - Нет несоответствий!
А давай-ка посмотрим на значения и тут началось:
Код: plaintext
1.
select *        from author a LEFT outer JOIN person p ON a.PERSON_ID = p.person_id -- 8 !!!!!!!!!!
select COUNT(*) from author a LEFT outer JOIN person p ON a.PERSON_ID = p.person_id --  821 !!!
Как такое может быть?!?!?!

С несовпадающими значениями что-то несложилось, давай посмотрим со совпадающими
Код: plaintext
1.
2.
select *        from author a, person p WHERE a.PERSON_ID = p.person_id -- 8
select COUNT(*) from author a, person p WHERE a.PERSON_ID = p.person_id -- 821

Лефт джоины не работают, вернёмся к старым добрым подзапросам
Код: plaintext
1.
select * from author a WHERE a.PERSON_ID NOT IN (SELECT p.person_id FROM person p) --813
select * from author a WHERE a.PERSON_ID IN (SELECT p.person_id FROM person p) -- 821 

Далее начались извращения с бубном:
Код: plaintext
select (select PERSON_ID from person p WHERE a.PERSON_ID = p.person_id) as pers, a.* from author a 
Этот запрос выдал, что в pers большинство значение NULL (кроме 8-ми)!!!
То есть в Author.person_id находятся значения такие значения, которіх нет в Person.person_id.
Я взял на пробу пару таких значений и действительно, таких значений в Персон нет.

Теперь вопросы:
Как может существовать такой внешний ключ, который ничего не ограничевает?
Как посмотреть состояние внешнего ключа? Может он и в исходной БД отключён.
Что происходит с запросами? Я не понимаю их работу
...
Рейтинг: 0 / 0
03.03.2009, 16:45
    #35848862
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Недостающие значения во внешних ключах
mwolfЯ отключаю внешний ключ и затем снова включаю его (я не знаю в каком состоянии был ключ до моих действий)
Код: plaintext
1.
 ALTER TABLE AUTHOR ALTER FOREIGN KEY SQL050915213038020 NOT ENFORCED
 ALTER TABLE AUTHOR ALTER FOREIGN KEY SQL050915213038020 ENFORCED
Теперь вопросы:
1. Как может существовать такой внешний ключ, который ничего не ограничевает?
2. Как посмотреть состояние внешнего ключа? Может он и в исходной БД отключён.
3. Что происходит с запросами? Я не понимаю их работу
Код: plaintext
1.
2.
3.
select ENFORCED, ENABLEQUERYOPT
from syscat.tabconst
where tabschema=USER and tabname='AUTHOR' and constname='SQL050915213038020'
Теперь ответы:
Informational constraints введены для тех случаев, когда логическая правильность данных проверяется на уровне приложений и проверка этой целостности на уровне базы слишком затратна. Информациия эта по желанию (для проверки см. ENABLEQUERYOPT) может быть использована оптимизатором для оптимизации запроса.
Негативный эффект от этого может быть в том, что запрос может возвращать неправильные данные (как в вашем случае), если есть нарушение ограничения и ENABLEQUERYOPT='Y'.
В таких случаях рекомендуется alter table ... alter constraint ... disable query optimization.
Сделайте так и перезапустите свои запросы.
...
Рейтинг: 0 / 0
04.03.2009, 14:47
    #35850991
mwolf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Недостающие значения во внешних ключах
Mark Barinsteinselect ENFORCED, ENABLEQUERYOPT
from syscat.tabconst
where tabschema=USER and tabname='AUTHOR' and constname='SQL050915213038020'
[/src]Теперь ответы:
Informational constraints введены для тех случаев, когда логическая правильность данных проверяется на уровне приложений и проверка этой целостности на уровне базы слишком затратна. Информациия эта по желанию (для проверки см. ENABLEQUERYOPT) может быть использована оптимизатором для оптимизации запроса.
Негативный эффект от этого может быть в том, что запрос может возвращать неправильные данные (как в вашем случае), если есть нарушение ограничения и ENABLEQUERYOPT='Y'.
В таких случаях рекомендуется alter table ... alter constraint ... disable query optimization.
Сделайте так и перезапустите свои запросы.

Да, это оно.
Правда откуда это вылезло не совсем понятно, но это уже наши проблемы.
Спасибо, а то я чуть мозг не сломал от таких результатов
:-)
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Недостающие значения во внешних ключах / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]