:: Visual Foxpro, Foxpro for DOS
Index On ... Unique и удаленная запись
Равиль
Автор

Сообщений: 6549
Откуда: Уфа
Дата регистрации: 01.08.2003
возможно это есть в хелпе, не смотрел

Set Deleted On
Use In Select("test")
Create Cursor test (n1 i)
Insert Into test Values (1)
Insert Into test Values (1)
Insert Into test Values (1) && неважно сколько добавить
Go Top
Delete && удаляем первую запись
Index On n1 Tag n1 Unique
Count To n && казалось бы должны быть записи
Wait Window " количество записей = "+Transform(n) && но увы - уникальный индекс учитывает первую удаленную запись,
*!* если она текущая перед индексацией, даже при Set Deleted On
Browse Last


------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: Index On ... Unique и удаленная запись
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
А если:
Go Top
Delete && удаляем первую запись
Go Top
Index On n1 Tag n1 Unique
Т.е. после пометки на удаление ведь как бы не произошло обновление.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: Index On ... Unique и удаленная запись
Равиль
Автор

Сообщений: 6549
Откуда: Уфа
Дата регистрации: 01.08.2003
Crispy
А если:
Go Top
Delete && удаляем первую запись
Go Top
Index On n1 Tag n1 Unique
Т.е. после пометки на удаление ведь как бы не произошло обновление.

Повторный Go Top не спасет в этой ситуации


------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: Index On ... Unique и удаленная запись
PaulWist

Сообщений: 14618
Дата регистрации: 01.04.2004
Равиль привет.

Это известная фича, что бы избежать делай фильтрованный индекс

Set Deleted On
Use In Select("test")
Create Cursor test (n1 i)
Insert Into test Values (1)
Insert Into test Values (1)
Insert Into test Values (1) && неважно сколько добавить
Go Top
Delete && удаляем первую запись
Index On n1 Tag n1 UNIQUE FOR NOT DELETED()
Count To n && казалось бы должны быть записи
Wait Window " количество записей = "+Transform(n) && но увы - уникальный индекс учитывает первую удаленную запись,
*!* если она текущая перед индексацией, даже при Set Deleted On
Browse Last


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Index On ... Unique и удаленная запись
Равиль
Автор

Сообщений: 6549
Откуда: Уфа
Дата регистрации: 01.08.2003
Потестил немножко и выяснил, что это проявляется,
если удаленная запись является текущей и содержит первое уникальное значение индексируемого поля (выражения)
например:
Set Deleted On
Use In Select("test")
Create Cursor test (n1 i)
Insert Into test Values (1)
Insert Into test Values (2)
Insert Into test Values (2)
Insert Into test Values (2) && неважно сколько добавить
Go 2
Delete && удаляем запись
Index On n1 Tag n1 Unique
Count To N
Wait Window " количество записей = "+Transform(m.n) && уникальный индекс учитывает первую удаленную запись,
*!* если она текущая перед индексацией, даже при Set Deleted On
*!* и содержит первое уникальное значение индексируемого поля (выражения)
Browse Last


------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: Index On ... Unique и удаленная запись
Равиль
Автор

Сообщений: 6549
Откуда: Уфа
Дата регистрации: 01.08.2003
PaulWist
Равиль привет.
Это известная фича, что бы избежать делай фильтрованный индекс
..


Паша, привет - я подозревал конечно


------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: Index On ... Unique и удаленная запись
PaulWist

Сообщений: 14618
Дата регистрации: 01.04.2004
Равиль
PaulWist
Равиль привет.
Это известная фича, что бы избежать делай фильтрованный индекс
..


Паша, привет - я подозревал конечно

Кстати, такая же байда с индексами кандидатами (Candidat).


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Index On ... Unique и удаленная запись
Chemberzhy

Сообщений: 13142
Откуда: Измаил
Дата регистрации: 28.04.2009
Насколько я сейчас припоминаю, однажды столкнувшись с такой хренью, я просто раз и навсегда взял себе за правило в выражение индекса добавлять
!deleted()


------------------
Что-то с памятью моей стало, всё что было не со мной- помню.
Ratings: 0 negative/0 positive
Re: Index On ... Unique и удаленная запись
leonid

Сообщений: 3204
Откуда: Рига
Дата регистрации: 03.02.2006
Unique индексами вообще не надо пользоваться. У них куча проблем, и не только с deleted. Вот пример некорректной работы такого индекса:
create cursor tmp (f1 i)
index on f1 tag f1 unique
insert into tmp values (1)
insert into tmp values (2)
insert into tmp values (1)
go 1
replace f1 with 3
browse
reindex
browse
Ratings: 0 negative/0 positive
Re: Index On ... Unique и удаленная запись
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Unique можно пользоваться в некоторых случаях, когда речь идет, например, о внешней НСИ, предназначенной только для чтения.
Ratings: 0 negative/0 positive
Re: Index On ... Unique и удаленная запись
leonid

Сообщений: 3204
Откуда: Рига
Дата регистрации: 03.02.2006
По-моему Select distinct даже в FPD был.
Ratings: 0 negative/0 positive
Re: Index On ... Unique и удаленная запись
sphinx

Сообщений: 31180
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Chemberzhy
Насколько я сейчас припоминаю, однажды столкнувшись с такой хренью, я просто раз и навсегда взял себе за правило в выражение индекса добавлять
!deleted()

+1




------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Index On ... Unique и удаленная запись
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Chemberzhy
Насколько я сейчас припоминаю, однажды столкнувшись с такой хренью, я просто раз и навсегда взял себе за правило в выражение индекса добавлять
!deleted()

Если речь идет об одновременном использовании в индексном выражении опций UNIQUE и FOR, то это вроде бы иногда будет приводить к некорректным результатам.
Или не будет?
Ratings: 0 negative/0 positive
Re: Index On ... Unique и удаленная запись
Владимир Максимов

Сообщений: 14098
Откуда: Москва
Дата регистрации: 02.09.2000
Так индекс не анализирует признак удаления записи. Set Deleted - это же просто фильтр, накладываемый на данные. Т.е. некое "внешнее" (по отношению к индексу) ограничение

Тут Паша уже говорил, что если сделать индекс Candidat, удалить запись и попытаться создать запись с удаленным значением, то будет сообщение об ошибке о нарушении уникальности. Т.е. для индекса пометка на удаление ничего не значит.

В справке VFP об этом говорится в описании настройки SET DELETED

Цитата:
Команды INDEX и REINDEX - всегда игнорируют установку команды SET DELETED, и индексируют все записи данной таблицы.

Принципиально Set Deleted ничем не отличается от SET FILTER. Ты же не удивляешься, что SET FILTER не оказывает влияние на индекс...

Так что, если нужно влияние на индекс, то только через выражение индекса или FOR-условие. В зависимости от того, как именно должно влиять
Ratings: 0 negative/0 positive
Re: Index On ... Unique и удаленная запись
Chemberzhy

Сообщений: 13142
Откуда: Измаил
Дата регистрации: 28.04.2009
Simple777
Chemberzhy
Насколько я сейчас припоминаю, однажды столкнувшись с такой хренью, я просто раз и навсегда взял себе за правило в выражение индекса добавлять
!deleted()

Если речь идет об одновременном использовании в индексном выражении опций UNIQUE и FOR, то это вроде бы иногда будет приводить к некорректным результатам.
Или не будет?

Давно, конечно, это было. Еще раньше было на 2.6...
Но, если память мне не изменяет, конструкция типа
INDEX on field_name TO index_file_name UNIQUE FOR !DELETED()
не подводила ни разу отлично из выборки убирала удаленные записи даже при условии
SET DELETED ON

К слову, применять такую конструкцию я начал именно еще с 2.6-го и оно у меня в правилах написания команд просто забилось в мозг как обязательное раз и навсегда.

О! Еще вспомнил, для SET FILTER в 2.6-м я тоже всегда дописывал !DELETED(). Потому что в выборку не попадали данные, если первая запись в таблице, подходящая под условия, была помечена на удаление. Вроде так. Опять таки, если не запамятовал по старческому склерозу, последний раз по взрослому кодил лет 10 назад, а на 2.6-м вообще лет 15.


------------------
Что-то с памятью моей стало, всё что было не со мной- помню.




Исправлено 5 раз(а). Последнее : Chemberzhy, 15.04.21 18:56
Ratings: 0 negative/0 positive
Re: Index On ... Unique и удаленная запись
Равиль
Автор

Сообщений: 6549
Откуда: Уфа
Дата регистрации: 01.08.2003
Владимир Максимов
Так индекс не анализирует признак удаления записи. Set Deleted - это же просто фильтр, накладываемый на данные. Т.е. некое "внешнее" (по отношению к индексу) ограничение
...

Спасибо - это все объясняет.


------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: Index On ... Unique и удаленная запись
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Chemberzhy
конструкция типа
INDEX on field_name TO index_file_name UNIQUE FOR !DELETED()
не подводила ни разу отлично из выборки убирала удаленные записи даже при условии
SET DELETED ON

С !deleted() в индексах не приходилось работать.

Могу лишь с уверенностью сказать, что при одновременном применении UNIQUE и FOR <условие> были случаи, когда записи "выпадали".

Тут ведь вопрос в чем - что сначала выполняется: фильтр FOR или формирование индекса с опцией UNIQUE.

Возможно, что при использовании условия !DELETED() сначала отрабатывает именно этот фильтр, а потом выполняется построение индекса. Но в общем случае, думается, что сначала строится индекс, а потом ставится фильтр FOR. И в таком случае опция UNIQUE иногда приводит к выпадению уникальных значений.



Исправлено 3 раз(а). Последнее : Simple777, 15.04.21 19:35
Ratings: 0 negative/0 positive
Re: Index On ... Unique и удаленная запись
Chemberzhy

Сообщений: 13142
Откуда: Измаил
Дата регистрации: 28.04.2009
Simple777
Chemberzhy
конструкция типа
INDEX on field_name TO index_file_name UNIQUE FOR !DELETED()
не подводила ни разу отлично из выборки убирала удаленные записи даже при условии
SET DELETED ON

С !deleted() в индексах не приходилось работать.

Могу лишь с уверенностью сказать, что при одновременном применении UNIQUE и FOR <условие> были случаи, когда записи "выпадали".

Тут ведь вопрос в чем - что сначала выполняется: фильтр FOR или формирование индекса с опцией UNIQUE.

Возможно, что при использовании условия !DELETED() сначала отрабатывает именно этот фильтр, а потом выполняется построение индекса. Но в общем случае, думается, что сначала строится индекс, а потом ставится фильтр FOR. И в таком случае опция UNIQUE иногда приводит к выпадению уникальных значений.

В приоритете обработки всегда выборка и только потом группировка. Это математика. А любой, мне кажется, язык программирования прежде всего опирается на законы математики.
То есть, сначала отработает физический фильтр по FOR и только потом сдвоенная функция UNIQUE: сперва группировка, потом расстановка по условиям заданного ранжира.


------------------
Что-то с памятью моей стало, всё что было не со мной- помню.




Исправлено 3 раз(а). Последнее : Chemberzhy, 15.04.21 21:20
Ratings: 0 negative/0 positive
Re: Index On ... Unique и удаленная запись
akvvohinc

Сообщений: 4219
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
То есть, сначала отработает физический фильтр по FOR и только потом сдвоенная функция UNIQUE: сперва группировка, потом расстановка по условиям заданного ранжира.

Это можно даже увидеть, ведь процесс индексации, который проходит в 2 этапа, можно отобразить на экране или в строке статуса.

Сначала генерируются ключи (keys generated), и видно что их количество не зависит от опции UNIQUE - количество сгенерированных ключей равно количеству записей что с UNIQUE, что без неё, но зависит от опции FOR - ключи будут создаваться только для записей, удовлетворяющих выражению FOR.

А затем уже создаются теги (records indexed) и количество проиндексированных записей (что с FOR, что без FOR) будет меньше количества созданных ключей, если задана опция UNIQUE и есть одинаковые ключи.

Цитата:
Но в общем случае, думается, что сначала строится индекс, а потом ставится фильтр FOR.

Соответственно это не так.



Исправлено 1 раз(а). Последнее : akvvohinc, 16.04.21 03:22
Ratings: 0 negative/0 positive
Re: Index On ... Unique и удаленная запись
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
akvvohinc
Соответственно это не так.

Означает ли это, что одновременное использование опций UNIQUE и FOR должно всегда корректно работать? По крайней мере в FPD 2.6 я сталкивался с ситуациями, когда результат был некорректен. Поэтому я предполагал, что сначала строится индекс по UNIQUE, а потом накладывается фильтр по условию FOR.

Сейчас уже не припомню подробностей, но это было связано с фильтрующим поиском по внешней по отношению к моему приложению dbf-таблице. Таблица содержала адреса, где наименование улично-дорожных дорожных элементов (далеко не все знают, что так обобщенно называются виды "улиц" - улицы, переулки, проспекты, тракты, тупики, проезды и т.п.) было в отдельном поле. Пользователь имел возможность выполнить поиск по наименованию. Допустим, юзер хочет увидеть все наименования улиц, где в наименовании есть буква Ю. То есть его интересуют не адреса, а только наименования улиц. Он задаёт букву Ю, и далее надо вывести все не повторяющиеся наименования улиц с буквой Ю. Для этого создавался временный индекс по условию (пример условный) :

Index on name for at("Ю", name) # 0 to tmpind unique


По какой-то причине иногда некоторые значения после такого индексирования "выпадали".

Поэтому я стал избегать в дальнейшем одновременно применять UNIQUE и FOR при построении индексов.



Исправлено 4 раз(а). Последнее : Simple777, 16.04.21 08:07
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 22 (Гостей: 22)

© 2000-2024 Fox Club 
Яндекс.Метрика