|
|
|
Сохранение уникальности ключа
|
|||
|---|---|---|---|
|
#18+
Вот возник такой вопросик. У меня в базе есть специальное поле - ключ уникально идентифицирующий запись. Формируется он с помощью хранимой процедуры по спец.таблице. И его надо обязательно сохранить, т.е. дальнейшие изменения над данным значением запрещены. Просто в программе есть код следующего вида (копирование записи, чтобы не заполнять однотипные строки заново) Код: plaintext 1. 2. 3. т.е. значение поля-ключа дублируется. Решил эту проблему с помощью правила на таблицу Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Насколько это корректно уважаемые гуру. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2006, 10:44 |
|
||
|
Сохранение уникальности ключа
|
|||
|---|---|---|---|
|
#18+
GATHER FROM la_tel FIELDS EXEPT rerid ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2006, 11:01 |
|
||
|
Сохранение уникальности ключа
|
|||
|---|---|---|---|
|
#18+
Если версия VFP8 или выше, то используй поле типа Integer-AutoIncrement и не мучайся... Для младших версий, синтаксически корректно. Ошибка в логике. Точнее, в самой идеологии работы с ключевым полем. Ключевое поле - это такое поле, которое вообще не должен видеть пользователь. В крайнем случае, он может его видеть, но не может редактировать. Если принять такую идеологию, то возникает закономерный вопрос: а как вообще значение ключевого поля может быть изменено? Только программно! Самим программистом. Получается, что ты сам себе не доверяешь? В чем "тайный смысл" такого контроля? "На всякий случай"? Тогда надо не "молча" возвращать старое значение, а выдавать сообщение об ошибке, что произошла попытка модификации ключевого поля. Какой смысл писать заведомо ошибочный код и самому же писать программу по исправлению своих же ошибок? PS: При создании новой записи функция OldVal() вернет значение NULL даже если поле не может принимать значение NULL. В результате, твой код пропустит ситуацию, когда значение ключевого поля было изменено при создании новой записи командой вроде Код: plaintext В данном случае функция DEFAULT не сработает, поскольку значение присваивается явно. И код RULE это пропустит, поскольку IsNull(OlDavl(...))=.T. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2006, 11:22 |
|
||
|
Сохранение уникальности ключа
|
|||
|---|---|---|---|
|
#18+
Вот посмотрел на код, действительно при Код: plaintext 1. 2. Значение по default не выполняется 8( Может в правиле записать проверку на уникальность. Просто код чужой и не я его писал, мне надо только добавить поле-ключ и формировать его. А с помощью default и rule этого добиться быстрее, да и нагляднее, чем просматривать весь код в поисках мест для исправлений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2006, 11:48 |
|
||
|
Сохранение уникальности ключа
|
|||
|---|---|---|---|
|
#18+
Для проверки на уникальность просто создай по тому полю индекс типа CANDIDAT. По самой своей природе такой индекс не допускает существование повторяющихся значений. Только имей в ввиду, что индекс рассматривает вообще все значения, в том числе и в записях, помеченных как удаленные. Разумеется, это можно обойти, если ты укажешь в индексе FOR-условие. Хотя, лично мне такие индексы (с FOR-условием) не нравятся по той причине, что они не используются в Rushmore-оптимизации. Как следствие, придется создавать 2 индекса: один для контроля уникальности, другой - для оптимизации. Впрочем, если функция генерации уникального значения не использует коды ранее удаленных записей, то можно обойтись одним индексом CANDIDAT без FOR-условий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2006, 13:21 |
|
||
|
|

start [/forum/topic.php?fid=41&gotonew=1&tid=1592274]: |
0ms |
get settings: |
11ms |
get forum list: |
22ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
63ms |
get topic data: |
7ms |
get first new msg: |
4ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 249ms |
| total: | 401ms |

| 0 / 0 |
