|
|
|
Foreign Key "1 to 0..1"
|
|||
|---|---|---|---|
|
#18+
в ASA 9.0.0 нужно сделать внешний ключ "1 к 0..1" Известно, что ASA индексирует внешние ключи самостоятельно, т.е. после создания внешнего ключа имеем неуникальный индекс. Это дает нам "1 к 0..n". Повесить на это поле ограничение UNIQUE (т.е. альтернативный ключ) нельзя, ибо тогда null не будут игнорироваться, и получится "1 к 1". Создавать еще один индекс ломает, т.к. получим 2 индекса, один из которых не нужен. Как измнеить системный индекс, или повлиять на его создание, я тоже не нашел. Пусть в Table_A первичный ключ PK_ID и внешний ключ из Foreign_ID - тот самый, что надо сделать "1 к 0..1". Нашел способ обойтись автоматическим индексом и одним ограничением. Вот что у меня окончательно получилось: Код: plaintext 1. 2. 3. 4. 5. Внутренний SELECT необходим, ибо любое упоминание Foreign_ID приводит к чтению нового значения, т.к. это имя поля из таблицы. Это только я так извращаюсь? Или можно сделать проще, и без двойных индексов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2004, 01:02 |
|
||
|
Foreign Key "1 to 0..1"
|
|||
|---|---|---|---|
|
#18+
В M$ это можно было сделать следующим образом: Создать View как Select * from MyTable Where id Is Not Null и повесить уникальный ключ на поле id. Про ASA не могу сказать, есть ли там возможность индексировать вьюхи :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2004, 01:32 |
|
||
|
Foreign Key "1 to 0..1"
|
|||
|---|---|---|---|
|
#18+
В ASA вешать индексы на представления нельзя. Можно только на вычисляемые поля. Кстати при создании UNIQUE тоже создается индекс, так что даже если бы и можно было сделать UNIQUE, то все равно получилось бы 2 индекса :) Вариант с использованием SQL скрипта в CHECK я бы вообще не рекомендовал использовать - при его использовании тормоза гарантированы, т.к. ASA придется вызывать этот скрипт для каждой вставляемой или обновляемой записи. С учетом использования NOT EXISTS, которого никогда не любил оптимизатор ни одной СУБД, кроме накладных расходов СУБД ничего не получим. Есть конечно вариант сделать AFTER EACH STATEMENT TRIGGER, в котором на весь массив вставляемых или обновляемых записей делать проверку одним запросом, однако тут тоже будут накладные расходы, т.к. СУБД сначала проведет операции записи в таблицу, а в случае возбуждения ошибки в триггере ей придется делать откат. С учетом всего вышесказанного мое личное мнение: это просто создать уникальный индекс на поле и не задумываться о лишнем индексе. Кстати уникальный индекс наоборот даже будет выгоден, так как оптимизатор уже точно будет знать, что поле в FOREIGN KEY уникально и предпочтет использовать этот индекс вместо своего системного в операциях выборок данных и вполне возможно будет его использовать при операциях изменения данных для проведения блокировок. P.S. Кстати CHECK единственное место, где булевая логика по своему работает с NULL: любая операция с NULL будет истинна. Т.е. в CHECK можно вместо ((Field IS NULL) OR (Field = 1)) написать (Field = 1). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2004, 08:08 |
|
||
|
|

start [/forum/topic.php?fid=55&msg=32541803&tid=2014456]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
41ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
| others: | 231ms |
| total: | 368ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...